首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Antlr 3关键词和标识符碰撞

Antlr 3关键词和标识符碰撞
EN

Stack Overflow用户
提问于 2013-05-31 21:55:46
回答 1查看 416关注 0票数 0

令人惊讶的是,我正在为一个项目构建一个类似SQL的语言解析器。

我让它大部分都能工作,但是当我开始根据它将要处理的实际请求测试它时,我意识到它在内部的表现与我想象中的不同。

以下语法中的主要问题是,我为language关键字‘pct_within’定义了一个词汇规则pct_within。这很好,但是如果我试图匹配一个像'attributes.pct_vac',这样的字段,我就会得到这个字段的文本'attributes.ac‘和一个漂亮的ANTLR错误:

代码语言:javascript
复制
line 1:15 mismatched character u'v' expecting 'c'

语法

代码语言:javascript
复制
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‘文本的标识符。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-01 10:24:28

将字段段解析器规则转换为lexer规则。现在,它将接受如下的输入

代码语言:javascript
复制
"abc      
_     abc"

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16866612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档