如何在令牌 JavaCC 中排除字符 "

How to exclude character " in a token JavaCC

您好,我正在使用 JavaCC,我正在编写一个标记,将一个字符串放在“”之间。上下文:

void literalString(): {} { """ (characteresString())? """ }
void characteresString(): {} { <characterString> | characteresString() <characterString> }

所以我制作了这个令牌来放置一个字符串:

TOKEN : {<characterString : ~["\", "] >}

问题是我不知道如何排除令牌中的 " 符号,如果我输入 """ 它会出错,如果我再次输入一个 " 则出错。

提前致谢

而不是

void literalString(): {} { """ (characteresString())? """ }

使用令牌定义

TOKEN : { <STRING : "\"" (<CHAR>)* "\"" >
        | <#CHAR : ~["\""] > // Any character that is not "
}

现在这将字符串定义为 ",后跟零个或多个非 " 的字符,再后跟另一个 ".

然而,某些语言有进一步的限制,例如只允许特定范围内的字符。例如,如果只允许打印 ascii 字符,但不包括 "s,那么您将使用

TOKEN : { <STRING : "\"" (<CHAR>)* "\"" >
        | <#CHAR: [" ","!","#"-"~"]> // Printable ASCII characters excluding "
}

但是,如果前面有 \,你想允许 " 个字符,并且你想禁止 \ 个字符,除非它们后面跟着 " ] 或另一个 \n。那么你可以使用

TOKEN : { <STRING : "\"" (<CHAR> | <ESCAPESEQ>)* "\"" >
        | <#CHAR: [" ","!","#"-"[","]"-"~"] > // Printable ASCII characters excluding \ and "
        | <#ESCAPESEQ: "\" ["\"","\","n"] > // 2-character sequences \, \", and \n
}