您好我正在使用JavaCC,我正在编写一个令牌,将一个字符串放在“”之间。上下文:
void literalString(): {} { """ (characteresString())? """ }
void characteresString(): {} { <characterString> | characteresString() <characterString> }
所以我做了这个令牌来放一个字符串:
TOKEN : {<characterString : ~["\", "] >}
问题是我不知道如何排除“令牌中的符号,如果我把”“”它给了我错误,如果我再犯一个“错误。
提前谢谢
答案 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
}