微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

否定无法匹配 antlr4

如何解决否定无法匹配 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 规则之前定义的词法分析器规则匹配。词法分析器的工作方式非常简单:

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。