【问题标题】:Can a lexer rule be applied in only one parser rule?一个词法分析器规则可以只应用于一个解析器规则吗?
【发布时间】:2012-09-06 19:01:24
【问题描述】:

我们在使用 ANTLR 时遇到的问题是我们的语法会解析如下内容:

Hello, my name is bob.
bob offset: 5

请记住“鲍勃”。第一行是动态的,可以是任何东西。其中之一是“鲍勃”。 “bob offset”行不是动态的,它存在于我们正在解析的每个类型的文件中。

所以,为了解析这个,我们有几个规则:

greeting: 'Hello, my name is' id1=IDENT '.' NEWLINE
    { System.out.println("Name: " + $id1.text"); }
    ;

bob_offset: 'bob offset:' id1=5 NEWLINE
    { System.out.println("bob offset: " + $id1.text); }
    ;

所以,问题在于“bob offset:”是词法分析器读取的标记。现在,当 greeting 规则执行时,会抛出错误,因为它试图将 'bob' 匹配到 'bob offset:',但它不能。

理想的解决方案是如果 ANTLR 有某种方式来指定上下文或解析器规则特定的词法分析器规则。这样,'bob offset:' 标记就不会在语法中的其他任何地方出错。

对此问题的任何想法将不胜感激。

【问题讨论】:

  • 不,这是不可能的。请注意,创建 'Hello, my name is''??? offset:' 之类的标记(即包含空格的多个单词)不是可行的方法。如果我是你,我会重新考虑我的方法。
  • 对如何改变我们的方法有什么建议吗?为每个单词制定词法规则?
  • 很难说不知道更多。我怀疑你是否已经用这个问题足够详细地解释了你的整个问题。想想如果你解析 "Hello , my name is ..." 会发生什么(逗号之前的空格会破坏它)。
  • 哦,我明白你在说什么。你是对的,我只是把主要问题归结为问这个问题。唯一一次我们会做类似“bob offset:”作为词法分析器规则的事情是当“bob offset:”是我们正在查看的文件的结构部分时。恰好结构部分可以与动态部分重叠。
  • 对不起,我不明白你的实际问题是什么。我认为最好解释你的真实问题,发布你的真实语法,并提供你试图解析的真实输入。不是它的一些简化版本。

标签: parsing antlr lexical-analysis


【解决方案1】:

我们最终不得不使用更多的解析器规则来解决这个问题,以便更具体地为 ANTLR 充实它。

【讨论】:

    猜你喜欢
    • 2020-09-14
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多