否定无法匹配 antlr4 中的运算符

Negation fails to match operators in 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。
默认错误侦听器打印例如

line 1:0 mismatched input '+' expecting 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));

不会产生任何错误或警告。

我怀疑你没有post整个语法。可能,您在解析器规则中有一些 '+' 文字,或者 '+' 已经与 WORD 规则之前定义的词法分析器规则匹配。词法分析器以一种非常简单的方式工作:

  1. 尝试为每个规则匹配尽可能多的字符
  2. 如果 2 个或更多规则匹配相同数量的字符,则让第一个定义的规则“获胜”

所以,如果您有这样的规则:

word: WORD;
PLUS : '+';
WORD: ~'a';

那么输入 "+" 将始终成为 PLUS 标记。即使解析器尝试匹配 WORD 标记。