惊喜,我正在为一个项目构建一个类似SQL的语言解析器。
我主要使用它,但是当我开始根据实际请求进行测试时它会处理,我意识到内部的行为与我想的不同。
以下语法中的主要问题是我为语言关键字“ pct_within ”定义词法分析器规则 PCT_WITHIN 。这样可以正常工作,但如果我尝试匹配“ attributes.pct_vac ”这样的字段,我会得到包含“ attributes.ac ”文本的字段以及漂亮的ANTLR错误的:
line 1:15 mismatched character u'v' expecting 'c'
语法
grammar Select;
options {
language=Python;
}
eval returns [value]
: field EOF
;
field returns [value]
: fieldsegments {print $field.text}
;
fieldsegments
: fieldsegment (DOT (fieldsegment))*
;
fieldsegment
: ICHAR+ (USCORE ICHAR+)*
;
WS : ('\t' | ' ' | '\r' | '\n')+ {self.skip();};
ICHAR : ('a'..'z'|'A'..'Z');
PCT_CONTAINS : 'pct_contains';
USCORE : '_';
DOT : '.';
我一直在阅读有关该主题的所有内容。即使错误,Lexer如何消耗它。如何使用语义预测来消除歧义/如何使用前瞻。但我读到的一切都没有帮助我解决这个问题。
老实说,我看不出它怎么会成为一个问题。我必须遗漏一些非常明显的东西,因为我看到的其他语法有Lexer规则,如 EXISTS ,但这不会导致解析器采用像' existsOrNot '这样的字符串并吐出和 IDENTIFIER ,文字为“ rNot ”。
我错过了什么或做错了什么?
答案 0 :(得分:1)
将您的fieldsegment解析器规则转换为词法分析器规则。现在它将接受像
这样的输入"abc
_ abc"
这可能不是你想要的。关键字“pct_contains”将不会与此规则匹配,因为它是单独定义的。如果您希望将某些序列中的关键字作为常规标识符接受,则必须将其包含在可接受的标识符规则中。