ANTLR4错误: Missing NEWLINE

标签 antlr4

grammar Hello;          
prog:   stat+ EOF;
stat:   expr NEWLINE    # printExpr 
|   ID '=' expr NEWLINE # assign
|   NEWLINE     # blank 
|   STRING NEWLINE  # string
;
expr:   expr (MUL|DIV) expr # opExpr
|   expr (ADD|SUB) expr # opExpr
|   expr AND expr # andExpr
|   INT         # int
|   ID          # id
|   '(' expr ')'        # parens
;
MUL:    '*';
DIV:    '/';
ADD:    '+';
SUB:    '-';
ID: [a-zA-Z]+[0-9a-zA-Z]*;
NEWLINE : [\r\n] ;
INT     : [0-9]+ ;
AND :     '&';
WS  : [ \t\r\n]+ -> skip;
CM  : '//' ~[\r\n]* -> skip;`

有人可以向我解释一下我的代码有什么问题吗?这是我的错误:

error

我们将不胜感激您的帮助!

最佳答案

问题出在这些词法分析器规则中:

NEWLINE : [\r\n] ;
WS : [ \t\r\n]+ -> skip;

当词法分析器在输入字符串中找到 \r\n 时,它将尝试匹配规则,并且两者都会匹配。但是,WS 将匹配整个 \r\n,生成一个 WS 标记,而 NEWLINE 将匹配 \r 然后 \n,生成两个 NEWLINE 标记。

在这种情况下,Antlr 始终选择最长的匹配,在您的情况下它将生成 WS。如果您查看词法分析器输出中的 a = 3\r\nx = 4\r\n,生成的标记将是:

ID WS '=' WS INT WS    ID WS '=' WS INT WS
a      =      3 \r\n   x      =     4   \r\n

但是您正在寻找的是:

ID WS '=' WS INT NEWLINE ID WS '=' WS INT NEWLINE
a      =      3  \r\n    x      =     4   \r\n

您的语法似乎完全是期望所有换行符生成 NEWLINE 标记,因此我建议将 WS 规则更改为:

WS: [ \t]+ -> skip;

关于ANTLR4错误: Missing NEWLINE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31164531/

相关文章:

antlr - 安装 Antlr v4.4 的问题

python - 如何在 Windows 上为 Python3 安装 antlr4

antlr - 防火墙配置解析器无关输入

java - 使用antlr4的二义性语法

java - 如何使用 ANTLR 构建交互式解析器?

java - 如何诊断我的 ANTLR4 语法中的歧义?

java - Antlr Eclipse IDE White Space 没有被跳过

python - ANTLR4 因 Lexer/Parser 错误而终止 Python

go - 我正在使用 Antlr4 创建一种语言,然后我想用它生成 LLVM IR。我是否需要手写 LLVM IR 来响应我的访问者事件?

java - Antlr4 在简单语法上没有找到任何可行的输入字符串替代方案