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

Ove*_*ose 2 antlr antlr3

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

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'));
Run Code Online (Sandbox Code Playgroud)

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

VAR A :='$12.2' END_VAR
Run Code Online (Sandbox Code Playgroud)

我得到MismatchedTokenException.

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

A :='$12.2' 
Run Code Online (Sandbox Code Playgroud)

Bar*_*ers 5

STRING_VALUE没有被正确地标记.在循环内部( ... )*,它$需要一个单引号,但输入中的字符串'$12.2'后面没有引号$.你应该使单引号可选('$' '\''? | .)*.但现在你在循环中的替代方案.,也会匹配单引号:更好地让它匹配除单引号之外的任何内容,并且$:

STRING_VALUE
 : '\'' ( '$' '\''? | ~('$' | '\'') )* '\''
 ;
Run Code Online (Sandbox Code Playgroud)

导致以下解析树:

在此输入图像描述