Antlr4:输入不匹配
Antlr4: Mismatch input
我的语法:
qwe.g4
grammar qwe;
query
: COLUMN OPERATOR value EOF
;
COLUMN
: [a-z_]+
;
OPERATOR
: ('='|'>'|'<')
;
SCALAR
: [a-z_]+
;
value
: SCALAR
;
WS : [ \t\r\n]+ -> skip ;
在 Python 代码中处理:
qwe.py
from antlr4 import InputStream, CommonTokenStream
from qweLexer import qweLexer
from qweParser import qweParser
conditions = 'total_sales>qwe'
lexer = qweLexer(InputStream(conditions))
stream = CommonTokenStream(lexer)
parser = qweParser(stream)
tree = parser.query()
for child in tree.getChildren():
print(child, '==>', type(child))
运行 qwe.py
解析时输出错误(词法分析?)value
:
如何解决?
我读了一些,并假设与 COLUMN 规则有关,该规则也匹配 value
...
您的 COLUMN
和 SCALAR
词法分析器规则相同。当 LExer 匹配两条规则时,识别最长令牌的规则将获胜。如果令牌长度相同(如此处所示),则第一个规则获胜。
您的令牌流将是 COLUMN OPERATOR COLUMN
那是你的 query
规则不匹配。
作为一般做法,最好使用 grun
别名(设置教程将告诉您如何设置)来转储令牌流。
grun qwe tokens -tokens < sampleInputFile
一旦得到预期的输出,您可能希望使用 grun
工具来显示输入的解析树以验证其正确性。所有这些都可以在不将生成的代码连接到目标语言的情况下完成,并且有助于确保在连接之前语法基本正确。
我的语法:
qwe.g4
grammar qwe;
query
: COLUMN OPERATOR value EOF
;
COLUMN
: [a-z_]+
;
OPERATOR
: ('='|'>'|'<')
;
SCALAR
: [a-z_]+
;
value
: SCALAR
;
WS : [ \t\r\n]+ -> skip ;
在 Python 代码中处理:
qwe.py
from antlr4 import InputStream, CommonTokenStream
from qweLexer import qweLexer
from qweParser import qweParser
conditions = 'total_sales>qwe'
lexer = qweLexer(InputStream(conditions))
stream = CommonTokenStream(lexer)
parser = qweParser(stream)
tree = parser.query()
for child in tree.getChildren():
print(child, '==>', type(child))
运行 qwe.py
解析时输出错误(词法分析?)value
:
如何解决?
我读了一些,并假设与 COLUMN 规则有关,该规则也匹配 value
...
您的 COLUMN
和 SCALAR
词法分析器规则相同。当 LExer 匹配两条规则时,识别最长令牌的规则将获胜。如果令牌长度相同(如此处所示),则第一个规则获胜。
您的令牌流将是 COLUMN OPERATOR COLUMN
那是你的 query
规则不匹配。
作为一般做法,最好使用 grun
别名(设置教程将告诉您如何设置)来转储令牌流。
grun qwe tokens -tokens < sampleInputFile
一旦得到预期的输出,您可能希望使用 grun
工具来显示输入的解析树以验证其正确性。所有这些都可以在不将生成的代码连接到目标语言的情况下完成,并且有助于确保在连接之前语法基本正确。