2

我的任务是创建一个词法分析器,除了一点点之外,我已经完成了所有工作。我需要创建一个将接受新行的字符串,并且该字符串由双引号分隔。该字符串接受分隔符内的任何数字、字母、某些指定的标点符号、反斜杠和双引号。我似乎无法弄清楚如何转义换行符。是否有某种转义字符的方法,例如换行符和制表符?

这是我的一些代码可能会有所帮助

< STRING : ( < QUOTE> (< QUOTE > | < BACKSLASH > | < ID > | < NUM > | " " )* <QUOTE>) >
< #QUOTE : "\"" >
< #BACKSLASH : "\\" >

所以我的字符串应该允许一个引号,然后是以下任何字符,如反斜杠、空格、数字等,然后是另一个引号。像 "\n" 这样的换行符不起作用。提前致谢!

4

1 回答 1

1

对于字符串文字,JavaCC 借用了 Java 的语法。因此,包含回车的单字符文字转义为"\r",而包含换行符的单字符文字转义为“ \n”。

但是,处理后的字符串值只是单个字符;这不是逃避本身。因此,假设您为换行定义了一个标记:

< LF : "\n" >

标记的匹配<LF>将是单个换行符。当在另一个记号的定义中替换记号时,单个字符被有效地替换。因此,假设您有更高级别的定义:

< STRING : "\"" ( <LF> ) "\"" >

令牌的匹配<STRING>将是三个字符:引号,后跟换行符,后跟引号。相反,您似乎想要的是识别转义序列:

< STRING : "\"" ( "\\n" ) "\"" >

Now a match of the token <STRING> will be four characters: a quotation mark, followed by an escape sequence representing a line feed, followed by a quotation mark.

In your current definition, I see that other often-escaped metacharacters like quotation mark and backslash are also being recognized literally, rather than as escape sequences.

于 2012-11-12T22:54:10.593 回答