ANTLR3字符串文字和不允许嵌套注释

时间:2013-04-25 16:00:03

标签: regex antlr token antlr3 antlrv3ide

我最近的任务是编写一个虚构语言的ANTLR3语法。其他一切似乎都很好,但我有一些小问题,我可以通过以下方面帮助:

1)评论介于'/*''*/'之间,可能不会嵌套。我知道如何自己实施评论('/*' .* '*/'),但我如何禁止他们的筑巢呢?

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

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

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

OUTPUT "Hello,
World!"

并将其标记为"Hello, \nWorld。感叹号或关闭"去了哪里我不知道。可能与空白有关吗?

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

非常感谢任何建议 - 感谢您的时间! :)

1 个答案:

答案 0 :(得分:0)

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

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

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