令人惊讶的是,我正在为一个项目构建一个类似SQL的语言解析器。
我让它大部分都能工作,但是当我开始根据它将要处理的实际请求测试它时,我意识到它在内部的表现与我想象中的不同。
以下语法中的主要问题是,我为language关键字‘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 : '.';我一直在阅读我能找到的关于这个话题的所有东西。雷克萨斯如何消费的东西,因为它发现它,即使它是错误的。如何使用语义预测消除歧义/如何使用前瞻性。但我读到的所有东西都帮不了我解决这个问题。
老实说,我不知道这怎么可能是个问题。我肯定遗漏了一些非常明显的东西,因为我看到的其他语法都有像存在这样的词汇规则,但这并不会导致解析器接受像这样的字符串,并使用'rNot‘文本的标识符。
我错过了什么或者做错了什么?
发布于 2013-06-01 10:24:28
将字段段解析器规则转换为lexer规则。现在,它将接受如下的输入
"abc
_ abc"这可能不是你想要的。关键字"pct_contains“不会与此规则匹配,因为它是单独定义的。如果要接受某些序列中的关键字作为常规标识符,则必须将其包含在已接受的标识符规则中。
https://stackoverflow.com/questions/16866612
复制相似问题