Правила Antlr Lexer - PullRequest
       44

Правила Antlr Lexer

3 голосов
/ 15 августа 2011

У меня есть правило для сопоставления строки, которая выглядит следующим образом:

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

Я не хочу, чтобы кавычки были частью текста токенов.В Antlr2 я бы просто поставил '!' после кавычек, чтобы сказать Antlr не добавлять их в текст.

Обратите внимание на '!' ниже.

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

Однако в Antlr3 я больше не могу сделать это, так как получаю ошибку:

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

Я не знаю, могу ли я использовать здесь правило перезаписи, так как я не знаю, как написать все совпаденияtoken '.'

Моя единственная другая мысль - захватить соответствующий текст и вернуть его без кавычек, но я не уверен, как это сделать, поскольку токен еще не создан.

Я использую среду выполнения C Antlr.Как мне это сделать?

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Для потомков я упомяну, как я решил эту проблему.

Я использовал блок @after для удаления кавычек

STRING
@after
{
    SETTEXT(GETTEXT()->substring(GETTEXT(),1,GETTEXT()->len-1))
}
: '"' ( ~( '"' | '\\' ) | '\\' . )* '"'
;
0 голосов
/ 12 января 2012

Это решение, которое я использовал в итоге:

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, поэтому есть \ $ Вы знаете, какой из них быстрее?

...