在Python中使用ANTLR4时遇到问题,并使ErrorListener工作



我这样声明我的错误侦听器:

class GeneratorErrorListener(ErrorListener):
def __init__(self, listener):
super().__init__()
self.listener = listener
def systaxError(self, recognizer, offendingSymbol, line, col, msg, e):
log_it("Syntax error at line {} col {}: {}".format(line, col, msg))

我还没有利用传入的侦听器,但当我让它发挥作用时,我会的。

并像这样设置:

...
# Set up new error listener
parser.removeErrorListeners()
parser.addErrorListener(GeneratorErrorListener(listener))
tree = parser.protocol()
...
walker.walk(listener, tree)

然后我用一些有语法错误的输入进行测试(AFAICS(:

语法片段为:

enumEltDecl : INT '=' ID ( ':' STRING)?
| 'default' '=' STRING
;
enumDecl:  'enum' ID ( ':' ID )? '{' enumEltDecl (',' enumEltDecl )*
(',')? '}' ;

我可以很好地解析这些东西。然而,我认为以下输入应该是语法错误,并且确实导致解析停止,但它没有调用错误侦听器:

emum some_emum:uint8 {
};

它应该至少有一个enumEltDecl。

你觉得我做错了什么吗?我已经查看了ErrorListener类的运行时代码,它看起来很简单。

更多信息

代码在这里:https://gitlab.com/realrichardsharpe/wireshark-generator-python

使用以下步骤查看问题:

  1. cd src
  2. /GenTool.py-t C/测试数据/语法错误.proto

您将看到以下输出:

#include "config.h"
#include <epan/packet.h>
#include <epan/expert.h>

//Generating code for enum cmd_enum
enum cmd_enum {
CMD1 = 0x14;
CMD2 = 0x15;
CMD3 = 0x28;
CMD4 = 0x29;
CMD5 = 0x3C;
CMD5 = 0x3D;
};
//We have a uint8
static const range_string cmd_enum_rvals[] = {
{ 0, 19, "Reserved", }
{ 0x14, 0x14, "cmd1" },
{ 0x15, 0x15, "cmd2" },
{ 22, 39, "Reserved", }
{ 0x28, 0x28, "cmd3" },
{ 0x29, 0x29, "cmd4" },
{ 42, 59, "Reserved", }
{ 0x3C, 0x3C, "cmd5" },
{ 0x3D, 0x3D, "cmd6" },
{ 62. 255, "Reserved" },
};

它在没有调用ErrorListener的情况下停止。ErrorListener位于GenTool.py.中

奇怪的是,经过一点代码重排和大量调试,它现在似乎可以工作了,因为我在使用不同的输入数据集时遇到了以下错误:

./GenTool.py -t C xxx.proto
line 3:0 mismatched input '}' expecting {'default', INT}
line 4:0 missing ';' at '<EOF>'
Syntax error on line 1

前两行是由我的错误监听器生成的。

更新:经过一点比较,我发现我的测试用例中有一个语法无法识别的符号,在这一点上一切都偏离了轨道。

真正的问题是我的语法不正确。第一行应该是:

protocol : protoDecl+ EOF ;

在我的原始语法中,EOF丢失,这导致解析器在遇到与语法不匹配的东西时停止。

相关内容

  • 没有找到相关文章

最新更新