2

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

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' 
4

1 回答 1

5

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

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

产生以下解析树:

在此处输入图像描述

于 2012-04-28T10:22:50.580 回答