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

时间:2015-05-16 19:35:19

标签: bnf javacc

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

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

所以我做了这个令牌来放一个字符串:

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

问题是我不知道如何排除“令牌中的符号,如果我把”“”它给了我错误,如果我再犯一个“错误。

提前谢谢

1 个答案:

答案 0 :(得分:1)

而不是

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

使用令牌定义

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

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

但是某些语言还有其他限制,例如只允许某个范围内的字符。例如,如果仅允许在"之外排除可打印的ascii字符,那么您将使用

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
}