我为字符串变量声明编写了以下语法。字符串定义为单引号之间的任何内容,但必须有一种方法可以通过使用 $ 字母转义将单引号添加到字符串值。
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'
答案 0 :(得分:5)
您的STRING_VALUE
未正确标记。在循环( ... )*
内,$
需要一个单引号,但输入中的字符串'$12.2'
在$
之后没有引号。您应该将单引号设为可选('$' '\''? | .)*
。但现在你在循环中的替代方法.
也会匹配单引号:更好地让它匹配除单引号和$
以外的任何内容:
STRING_VALUE
: '\'' ( '$' '\''? | ~('$' | '\'') )* '\''
;
导致以下解析树: