首页 > 解决方案 > 错误:“(”在寻找词法分析器规则元素时让我感到完全惊讶

问题描述

我尝试为以下分配匹配 STRING_LITERAL

字符串 字符串文字包含零个或多个用双引号 (”) 括起来的字符。使用转义序列(如下所列)来表示字符串中的特殊字符。请记住,引号不是字符串的一部分。换行符或 EOF 字符出现在开始 (”) 之后和结束匹配 (”) 之前是编译时错误。所有支持的转义序列如下:

\b 退格
\f换页符
\r 回车符
\n 换行符
\t 水平制表符
\' 单引号
\ 反斜杠
对于字符串中的双引号 ("),单引号 (')必须在它前面写:'”双引号
例如:
”这是一个包含制表符 \t 的字符串”<br> ”他问我:'”John 在哪里?'””<br>

一开始我的代码是这样的:

// Every char that isn't ESC_ILLEGAL or is ESC_SEQ 
STRING_LITERAL: '"' STR_CHAR* '"';

fragment STR_CHAR: ~ESC_ILLEGAL| ESC_SEQ;

fragment ESC_SEQ: ([\\] [btnfr'\\]) | [{'"}];

fragment ESC_ILLEGAL: (([\\] ~[btnfr'\\]) | ['] ~["]);

但由于 ANTLR 语法问题,我不得不编写内联 ESC_ILLEGAL,我的最终代码是这样的:

STRING_LITERAL: '"' STR_CHAR* '"';

fragment STR_CHAR: ~(([\\] ~[btnfr'\\]) | ['] ~["]) | ESC_SEQ;

fragment ESC_SEQ: ([\\] [btnfr'\\]) | [{'"}];

现在 ANTLR 抛出一个错误:'(' came as a complete surprise to me while looking for lexer rule element
我试图搜索这个错误,甚至使用 De Morgan 更改我的 STR_CHAR 来取悦 ANTLR(但这不起作用,因为 AND 不受 ANTLR 支持)。顺便说一句,我不太确定我的 STRING_LITERAL 是否正确,如果您可以为此提供一些建议,那就太好了。我对 ANTLR 完全陌生,所以也许我做的很多事情看起来都错了,但如果可以的话,请帮助我。

提前致谢。

标签: antlrantlr4

解决方案


只有当否定集中有单个字符时,才能在词法分析器中否定字符集。所以这是有效的:

FOO : ~(('a' | 'b') | 'c');

但这不是:

FOO : ~(('ab') | 'c'); // 'ab' cannot be negated

你的问题是这样的:

~(([\\] ~[btnfr'\\]) | ['] ~["])

你不能否定任何匹配的(([\\] ~[btnfr'\\]) | ['] ~["]).


推荐阅读