Antlr Lexer规则

时间:2011-08-15 01:16:22

标签: antlr3 lexer

我有一条匹配字符串的规则:

STRING
    : '"' ( ~( '"' | '\\' ) | '\\' . )* '"'
    ;

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

请注意下面的'!'

 STRING
    : '"'! ( ~( '"' | '\\' ) | '\\' . )* '"'!
    ;

然而在Antlr3中,我不能再这样做了,因为我收到了错误:

warning(149): Crv__.g:0:0: rewrite syntax or operator with no output option; setting output=AST

我不知道我是否可以在这里使用重写规则,因为我不知道如何写匹配所有令牌'。'

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

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

2 个答案:

答案 0 :(得分:1)

对于后人,我会提到我最终是如何解决这个问题的。

我使用@after块来删除引号

STRING
@after
{
    SETTEXT(GETTEXT()->substring(GETTEXT(),1,GETTEXT()->len-1))
}
: '"' ( ~( '"' | '\\' ) | '\\' . )* '"'
;

答案 1 :(得分:0)

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

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语言,这就是为什么有\ $ 你知道哪一个更快吗?