首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Antlr词法规则

Antlr词法规则
EN

Stack Overflow用户
提问于 2011-08-15 01:16:22
回答 1查看 2.7K关注 0票数 3

我有一个规则来匹配一个看起来是这样的字符串:

代码语言:javascript
复制
STRING
    : '"' ( ~( '"' | '\\' ) | '\\' . )* '"'
    ;

我不希望引号成为令牌文本的一部分。在Antlr2中,我将'!'放在引号后面,告诉Antlr不要将它们添加到文本中。

注意下面的'!'

代码语言:javascript
复制
 STRING
    : '"'! ( ~( '"' | '\\' ) | '\\' . )* '"'!
    ;

但是,在Antlr3中,我不能再这样做了,因为我得到了错误:

代码语言:javascript
复制
warning(149): Crv__.g:0:0: rewrite syntax or operator with no output option; setting output=AST

我不知道是否可以在这里使用重写规则,因为我不知道如何编写match everything token‘。

我唯一的其他想法是抓取匹配的文本,并返回它没有引号,但我不知道如何做到这一点,因为令牌尚未创建。

我正在使用C运行时。我怎样才能做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2012-01-12 10:59:44

这是我最后使用的解决方案:

代码语言:javascript
复制
STRING          :       '"'         { \$s = ""; }
                (   '"' '"'         { \$s .= '"';}
                |   c=CHAR          { \$s .= \$c->gettext();}
                |   ' '             { \$s .= ' ';}
                )*
                '"'                 { \$this->setText(\$s); }
    ;



fragment CHAR       :   (ACCENT|SPECIAL|ALPHA|DIGIT);
fragment ACCENT     :   '\u00C0'..'\u00D6' | '\u00D9'..'\u00DD' | '\u00E0'..'\u00F6' |'\u00F9'..'\u00FD';
fragment SPECIAL    :   '.' | '!' | '-'| '?';
fragment ALPHA      :   'a'..'z' | 'A'..'Z';
fragment DIGIT      :   '0'..'9' ;

有一个小的区别,那就是出于安全原因,我有一个白色字符列表。

,但主要的区别是,我递增地构建结果字符串,抛出“char.”。

我使用PHP语言,这就是为什么\$你知道哪个更快吗?

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

https://stackoverflow.com/questions/7060904

复制
相关文章

相似问题

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