ANTLR词法分析器中的特殊字符处理

时间:2012-04-28 09:33:44

标签: antlr antlr3

我为字符串变量声明编写了以下语法。字符串定义为单引号之间的任何内容,但必须有一种方法可以通过使用 $ 字母转义将单引号添加到字符串值。

grammar test;

options       
{   
    language = Java;
}


tokens
{   
    VAR = 'VAR';
    END_VAR = 'END_VAR';
}


var_declaration: VAR string_type_declaration END_VAR EOF;

string_type_declaration: identifier ':=' string;

identifier: ID;

string: STRING_VALUE;

STRING_VALUE: '\'' ('$\''|.)* '\'';

ID:  LETTER+;

WSFULL:(' ') {$channel=HIDDEN;};

fragment LETTER: (('a'..'z') | ('A'..'Z'));

如果您尝试为var_declaration规则运行此代码,则此语法不起作用:

VAR A :='$12.2' END_VAR

我收到MismatchedTokenException。

但是这段代码适用于string_type_declaration规则:

A :='$12.2' 

1 个答案:

答案 0 :(得分:5)

您的STRING_VALUE未正确标记。在循环( ... )*内,$需要一个单引号,但输入中的字符串'$12.2'$之后没有引号。您应该将单引号设为可选('$' '\''? | .)*。但现在你在循环中的替代方法.也会匹配单引号:更好地让它匹配除单引号和$以外的任何内容:

STRING_VALUE
 : '\'' ( '$' '\''? | ~('$' | '\'') )* '\''
 ;

导致以下解析树:

enter image description here