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...

您的 COLUMNSCALAR 词法分析器规则相同。当 LExer 匹配两条规则时,识别最长令牌的规则将获胜。如果令牌长度相同(如此处所示),则第一个规则获胜。

您的令牌流将是 COLUMN OPERATOR COLUMN

那是你的 query 规则不匹配。

作为一般做法,最好使用 grun 别名(设置教程将告诉您如何设置)来转储令牌流。

grun qwe tokens -tokens < sampleInputFile

一旦得到预期的输出,您可能希望使用 grun 工具来显示输入的解析树以验证其正确性。所有这些都可以在不将生成的代码连接到目标语言的情况下完成,并且有助于确保在连接之前语法基本正确。