我正在实现一个简单的程序walker语法,我在多行中得到了这个常见错误。我认为这是由同样的原因造成的,但我是antlr的新手,所以我无法理解。
例如,在以下代码段中:
program
: (declaration)*
(statement)*
EOF!
;
我收到了错误:
在输入'!'
时没有可行的选择
在EOF
之后,我遇到了类似的错误:
declaration
: INT VARNUM '=' expression ';'
-> ^(DECL VARNUM expression)
;
我收到了错误:
输入' - >'
没有可行的选择
在阅读其他问题后,我知道将一个令牌与多个定义匹配会导致此问题。但我还没有用任何输入测试它,我在intelliJ中遇到了这个错误。我该如何解决我的问题?
答案 0 :(得分:1)
这是ANTLR v3语法,您正尝试使用ANTLR v4编译它,这将无效。
要么降级到ANTLR v3,要么使用v4语法。不同之处在于v4不支持自动生成AST,并且您正在尝试使用已删除的AST构造运算符。
第一个代码段只要求您删除 >>> (1024).to_bytes(2, byteorder='big')
b'\x04\x00'
>>> (1024).to_bytes(10, byteorder='big')
b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
>>> (-1024).to_bytes(10, byteorder='big', signed=True)
b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'
>>> x = 1000
>>> x.to_bytes((x.bit_length() // 8) + 1, byteorder='little')
b'\xe8\x03'
。括号不是必需的。
!
至于第二个,删除program
: declaration*
statement*
EOF
;
:
->
如果您需要使用v4构建AST,请参阅my answer here。