我有一个规则来匹配一个看起来是这样的字符串:
STRING
: '"' ( ~( '"' | '\\' ) | '\\' . )* '"'
;我不希望引号成为令牌文本的一部分。在Antlr2中,我将'!'放在引号后面,告诉Antlr不要将它们添加到文本中。
注意下面的'!'。
STRING
: '"'! ( ~( '"' | '\\' ) | '\\' . )* '"'!
;但是,在Antlr3中,我不能再这样做了,因为我得到了错误:
warning(149): Crv__.g:0:0: rewrite syntax or operator with no output option; setting output=AST我不知道是否可以在这里使用重写规则,因为我不知道如何编写match everything token‘。
我唯一的其他想法是抓取匹配的文本,并返回它没有引号,但我不知道如何做到这一点,因为令牌尚未创建。
我正在使用C运行时。我怎样才能做到这一点?
发布于 2012-01-12 10:59:44
这是我最后使用的解决方案:
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语言,这就是为什么\$你知道哪个更快吗?
https://stackoverflow.com/questions/7060904
复制相似问题