如何解决否定无法匹配 antlr4
我有以下 antlr4 语法:
grammar nota;
word: WORD;
WORD: ~'a'; //match anything that isn't an 'a'
正如 the documentation 描述的那样,这否定了单个给定字符或字符范围的字符集。
然后我尝试解析一些测试用例文本(每个测试用例输入一个字符):a
预期失败b
预期成功$
预期成功+
意外失败=
意外失败§
预期成功\
预期成功/
意外失败~
预期成功
以防万一,我使用的是 nodejs 的 antlr4ts 0.5.0-alpha.4。
默认错误侦听器打印例如
第 1:0 行不匹配的输入“+”需要 WORD
我是不是误解了 antlr 的 ~
运算符?
这是一个应该报告的错误吗?我在 github issue tracker 中没有看到任何东西。
编辑:为了解决该错误,我将语法更改为 WORD: '+'|~'a';
,但由于某种奇怪的原因也无法匹配 +
。
这也无法解析 +
:
grammar nota;
word: WORD | OPERATORS;
OPERATORS: '+'|'-'|'*'|'/'|'=';
WORD: ~'a';
这成功解析+
:
grammar nota;
word: WORD | '+'|'-'|'*'|'/'|'=';
WORD: ~'a';
解决方法
我无法用 0.5.0-alpha.4
重现它。
给定语法:
grammar nota;
word: WORD;
WORD: ~'a';
运行此代码:
import { CharStreams,CommonTokenStream } from 'antlr4ts';
import { notaLexer } from './parser/notaLexer';
import { notaParser } from './parser/notaParser';
const lexer = new notaLexer(CharStreams.fromString("+"));
const parser = new notaParser(new CommonTokenStream(lexer));
const root = parser.word();
console.log(root.toInfoString(parser));
不会产生任何错误或警告。
我怀疑你没有发布完整的语法。可能,您在解析器规则中有一些 '+'
文字,或者 '+'
已经与在 WORD
规则之前定义的词法分析器规则匹配。词法分析器的工作方式非常简单:
- 尝试为每个规则匹配尽可能多的字符
- 如果有 2 个或更多规则匹配相同数量的字符,则让第一个定义的“获胜”
所以,如果你有这样的规则:
word: WORD;
PLUS : '+';
WORD: ~'a';
那么输入 "+"
将始终成为 PLUS
标记。即使解析器尝试匹配 WORD
标记。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。