Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在Python3.7中,Antlr4解析器在错误放置的标记上过早结束_Python 3.x_Antlr4_Grammar - Fatal编程技术网

Python 3.x 在Python3.7中,Antlr4解析器在错误放置的标记上过早结束

Python 3.x 在Python3.7中,Antlr4解析器在错误放置的标记上过早结束,python-3.x,antlr4,grammar,Python 3.x,Antlr4,Grammar,我遇到了一个问题,如果解析器发现一个标记,它无法放入任何规则中,那么它会在不显式报告错误的情况下结束,即使之后还有更多的标记要放入。确切地说,令牌实际上是可以识别的(我有一个规则,这是一个几乎包罗万象的规则),但是令牌放错了位置,不能被任何规则覆盖。在本例中,我的解析器成功地结束了,并且没有报告任何错误(至少是大声报告) 这就是我看到的情况: 要分析的代码: .class public final Ld; .super Ljava/lang/Object; .source "java-

我遇到了一个问题,如果解析器发现一个标记,它无法放入任何规则中,那么它会在不显式报告错误的情况下结束,即使之后还有更多的标记要放入。确切地说,令牌实际上是可以识别的(我有一个规则,这是一个几乎包罗万象的规则),但是令牌放错了位置,不能被任何规则覆盖。在本例中,我的解析器成功地结束了,并且没有报告任何错误(至少是大声报告)

这就是我看到的情况: 要分析的代码:

.class public final Ld;
.super Ljava/lang/Object;
.source "java-style lambda group"

# interfaces
.implements Landroid/content/DialogInterface$OnClickListener;
<misplaced-tokens>

# static fields
.field public static final f:Ld;

.field public static final g:Ld;

...
我的设置如下:

Windows 10 OS
Python 3.7
Antlr4 v4.8 - antlr-4.8-complete.jar
pip-installed runtime: antlr4_python3_runtime-4.8-py3-none-any.whl
我非常感谢任何关于如何使Antlr4真正考虑被重写的侦听器和策略的帮助,这样我既可以报告错误进行调试,也可以以不同的方式处理它们。谢谢

Antlr4解析器过早结束

当您调用的规则(在您的情况下为
parse
)未被内置的
EOF
标记“锚定”时,可能会发生这种情况:

parse
 : expression
 ;

expression
 : expression '+' expression
 | NUMBER
 ;
在上述情况下,当输入为
1+23
时,生成的解析器将愉快地解析
1+2

如果要强制解析器使用输入流中的所有令牌,请将
EOF
添加到开始规则中:

parse
 : expression EOF
 ;

您的
解析
规则是什么样子的?它的末尾是否有一个
EOF
?我猜不会,在这种情况下,建议您添加它。默认情况下,ANTLR生成的解析器会尝试以您可能不喜欢的方式从错误中恢复。所以,拿一本ANTLR的书来研究错误恢复,然后你应该了解如何继续。互联网上可能有以前的讨论,但要找到适合你的确切讨论并不容易。(我参与了一个ANTLR 3的帖子)非常感谢你们的两个建议,但@BartKiers的答案确实奏效了!我可以发誓我已经试过了,但没有成功,但我还是试过了。回想起来,我认为我犯了一个愚蠢的错误,在EOF前面加了“或”(比如
…|EOF
,当然这不起作用)。谢谢你们两个!很酷,很高兴听到这个消息。我将添加一个快速的答案,以防其他人在这个问答中绊倒,并且没有阅读评论
Windows 10 OS
Python 3.7
Antlr4 v4.8 - antlr-4.8-complete.jar
pip-installed runtime: antlr4_python3_runtime-4.8-py3-none-any.whl
parse
 : expression
 ;

expression
 : expression '+' expression
 | NUMBER
 ;
parse
 : expression EOF
 ;