我为字符串变量声明编写了以下语法.字符串定义为单引号之间的任何内容,但必须有一种方法通过使用$ 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)
您STRING_VALUE没有被正确地标记.在循环内部( ... )*,它$需要一个单引号,但输入中的字符串'$12.2'后面没有引号$.你应该使单引号可选('$' '\''? | .)*.但现在你在循环中的替代方案.,也会匹配单引号:更好地让它匹配除单引号之外的任何内容,并且$:
STRING_VALUE
: '\'' ( '$' '\''? | ~('$' | '\'') )* '\''
;
Run Code Online (Sandbox Code Playgroud)
导致以下解析树:
