Antlr 3关键字和标识符冲突

时间:2013-05-31 21:55:46

标签: tokenize antlr3 context-free-grammar

惊喜,我正在为一个项目构建一个类似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 ”。

我错过了什么或做错了什么?

1 个答案:

答案 0 :(得分:1)

将您的fieldsegment解析器规则转换为词法分析器规则。现在它将接受像

这样的输入
"abc      
_     abc"

这可能不是你想要的。关键字“pct_contains”将不会与此规则匹配,因为它是单独定义的。如果您希望将某些序列中的关键字作为常规标识符接受,则必须将其包含在可接受的标识符规则中。