否定无法匹配 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
规则之前定义的词法分析器规则匹配。词法分析器以一种非常简单的方式工作:
- 尝试为每个规则匹配尽可能多的字符
- 如果 2 个或更多规则匹配相同数量的字符,则让第一个定义的规则“获胜”
所以,如果您有这样的规则:
word: WORD;
PLUS : '+';
WORD: ~'a';
那么输入 "+"
将始终成为 PLUS
标记。即使解析器尝试匹配 WORD
标记。
我有以下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
规则之前定义的词法分析器规则匹配。词法分析器以一种非常简单的方式工作:
- 尝试为每个规则匹配尽可能多的字符
- 如果 2 个或更多规则匹配相同数量的字符,则让第一个定义的规则“获胜”
所以,如果您有这样的规则:
word: WORD;
PLUS : '+';
WORD: ~'a';
那么输入 "+"
将始终成为 PLUS
标记。即使解析器尝试匹配 WORD
标记。