【发布时间】: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