0

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

1) 注释在'/*'和之间'*/',不能嵌套。我知道如何自己实现注释('/*' .* '*/'),但是我将如何禁止它们的嵌套呢?

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

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

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

OUTPUT "Hello,
World!"

并将其标记为"Hello, \nWorld. "我不知道感叹号或结束在哪里。也许与空白有关?

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

任何建议将不胜感激 - 感谢您的宝贵时间!:)

4

1 回答 1

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

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

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

于 2013-04-25T16:12:40.270 回答