我有一个创建词法分析器的任务,除了一点之外,我已经完成了所有工作。 我需要创建一个接受新行的字符串,并用双引号分隔字符串。 该字符串接受分隔符中的任何数字,字母,一些指定的标点符号,反斜杠和双引号。 我似乎无法弄清楚如何逃避新的线条角色。 是否有某种方法可以转义像新行和制表符这样的字符?
以下是我的一些可能有用的代码
< STRING : ( < QUOTE> (< QUOTE > | < BACKSLASH > | < ID > | < NUM > | " " )* <QUOTE>) >
< #QUOTE : "\"" >
< #BACKSLASH : "\\" >
所以我的字符串应该允许引用,然后任何以下字符,如反斜杠,空格,数字等,然后是另一个引号。 像“\ n”这样的换行符是什么不起作用。 提前谢谢!
答案 0 :(得分:1)
对于字符串文字,JavaCC借用了Java的语法。因此,包含回车符的单字符文字将转义为"\r"
,包含换行符的单字符文字将转义为“\n
”。
但是,处理后的字符串值只是一个字符;它不是逃避本身。因此,假设您为换行定义了一个令牌:
< LF : "\n" >
令牌<LF>
的匹配将是单个换行符。当在另一个令牌的定义中替换令牌时,单个字符被有效地替换。所以,假设您有更高级别的定义:
< STRING : "\"" ( <LF> ) "\"" >
令牌<STRING>
的匹配将是三个字符:引号,后跟换行符,后跟引号。你似乎想要的是为了识别转义序列:
< STRING : "\"" ( "\\n" ) "\"" >
现在,令牌<STRING>
的匹配将是四个字符:引号,后跟表示换行符的转义序列,后跟引号。
在您当前的定义中,我看到其他经常被转义的元字符(如引号和反斜杠)也会被字面识别,而不是作为转义序列。