我最近的任务是编写一个虚构语言的ANTLR3语法。其他一切似乎都很好,但我有一些小问题,我可以通过以下方面帮助:
1)评论介于'/*'
和'*/'
之间,可能不会嵌套。我知道如何自己实施评论('/*' .* '*/'
),但我如何禁止他们的筑巢呢?
2)字符串文字被定义为一对双引号之间的任何字符序列(双引号和新行除外)。它们只能用于输出语句。我试图这样定义:
output : OUTPUT (STRINGLIT | IDENT) ;
STRINGLIT : '"' ~('\r' | '\n' | '"')* '"' ;
但出于某种原因,解析器接受
OUTPUT "Hello,
World!"
并将其标记为"Hello, \nWorld
。感叹号或关闭"
去了哪里我不知道。可能与空白有关吗?
WHITESPACE : ( '\t' | ' ' | '\n' | '\r' | '\f' )+ { $channel = HIDDEN; } ;
非常感谢任何建议 - 感谢您的时间! :)
答案 0 :(得分:0)
您编写的表单已禁止嵌套注释。即使注释中出现多个*/
序列,令牌也会在/*
的第一个实例处停止。要允许嵌套注释,您必须编写词法分析器规则以专门处理嵌套。
此处的问题是STRINGLIT
不允许将字符串拆分为多行。在没有看到lexer规则的其余部分的情况下,我无法告诉您如何对其进行标记化,但从您给出的STRINGLIT
规则可以清楚地看出,示例输入不是有效的字符串。
注意:您在原始问题中给出的输入不清楚,因此我重新格式化它以试图显示您正在使用的确切输入。你能验证我的编辑是否正确代表了输入?