2013-04-25 56 views
0

我最近被授权为虚构语言编写ANTLR3语法。一切似乎都很好,但我遇到了一些小问题,我可以用一些帮助来做:ANTLR3字符串文字和禁止嵌套注释

1)注释在'/*''*/'之间,可能不是嵌套的。我知道如何自己实施评论('/*' .* '*/'),但我会如何去禁止他们的嵌套?

2)字符串文字被定义为一对双引号之间的任何字符序列(双引号和新行除外)。它们只能用在输出语句中。我试图这样定义的:

output : OUTPUT (STRINGLIT | IDENT) ; 
STRINGLIT : '"' ~('\r' | '\n' | '"')* '"' ; 

出于某种原因,然而,解析器接受

OUTPUT "Hello, 
World!" 

和tokenises它作为"Hello, \nWorld。感叹号或关闭"去了,我不知道。可能与空白有关?

WHITESPACE : ('\t' | ' ' | '\n' | '\r' | '\f')+ { $channel = HIDDEN; } ; 

任何意见将不胜感激 - 感谢您的时间! :)

回答

0
  1. 您写的表单已经不允许嵌套注释。即使在注释中出现多个/*序列,令牌也会在第一个*/实例处停止。要允许嵌套注释,您必须编写一个词法分析规则来专门处理嵌套。

  2. 这里的问题是STRINGLIT不允许将字符串拆分为多行。在没有看到其他词法分析器规则的情况下,我无法告诉您这是如何标记的,但从您给出的STRINGLIT规则可以清楚地看出,示例输入不是有效的字符串。

注意:您在原始问题中给出的输入不清楚,因此我重新格式化了它以尝试显示您正在使用的确切输入。你能证实我的编辑能正确表示输入吗?

+0

非常感谢280Z28 - 你对非嵌套性质完全正确,我不相信我没有发现!你的编辑确实代表了输入 - 谢谢! 我需要澄清第2点:不应允许STRINGLIT跨多行分割,但使用我定义的语法,解释器允许我这样做,输出显示在上面。我不确定为什么会出现这种情况! – 2013-04-25 16:33:31

+0

ANTLR 3 *解释器*经常产生不正确的结果。您是否尝试过运行实际的解析器? – 2013-04-25 16:43:06