antlr - 错误:“(”在寻找词法分析器规则元素时让我感到完全惊讶
问题描述
我尝试为以下分配匹配 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 完全陌生,所以也许我做的很多事情看起来都错了,但如果可以的话,请帮助我。
提前致谢。
解决方案
只有当否定集中有单个字符时,才能在词法分析器中否定字符集。所以这是有效的:
FOO : ~(('a' | 'b') | 'c');
但这不是:
FOO : ~(('ab') | 'c'); // 'ab' cannot be negated
你的问题是这样的:
~(([\\] ~[btnfr'\\]) | ['] ~["])
你不能否定任何匹配的(([\\] ~[btnfr'\\]) | ['] ~["])
.
推荐阅读
- c - 有没有办法将这两个 int 变量分开并得到一个有效的浮点值,Itried double 但它不能正常工作,谢谢
- css - 换行文本在 flex 行中占用了太多空间
- javascript - 内容键没有在数据中抛出值
- c# - Vector3*float 很慢
- firebase - Google DialogFlow V2 执行中的神秘错误(Google Assistant 模拟器空响应、请求、错误选项卡)
- django - 项目中不同应用程序之间的Django Session Scope问题
- swift - 无法在 SKProductsResponse 模拟中设置 invalidProductIdentifiers
- python - Python:多个同时请求
- python - 按特殊条件排序的 SQL 查询
- git - 如何在 2 次提交之间创建一个 git diff/diff-tree/archive 与此时的文件版本(不是头部)