如何使用反斜杠转义字符在JavaCC的新的生产线?(How to use backslash esc

2019-07-03 16:24发布

我有一个分配创建一个词法分析器,我就拥有了一切,除了一个位的工作。 我需要创建一个字符串,将接受一个新行,字符串用双引号分隔。 字符串接受任何数字,字母,一些指定的标点符号,反斜线和双引号分隔符之内。 我似乎无法弄清楚如何逃脱换行符。 有没有像逃避新行和制表符的某种方式?

下面是我的一些代码,这可能有助于

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

所以我的字符串应该允许一个报价,那么任何像一个反斜杠,一个空格,一个号码等下列字符,然后再接再报价。 像“\ n”换行字符就是不工作。 提前致谢!

Answer 1:

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

然而,处理后的字符串值仅仅是一个单独的字符; 它不是逃避本身。 因此,假设您定义换行令牌:

< LF : "\n" >

令牌的匹配<LF>将是一个单个换行字符。 当代入另一令牌的定义中的令牌时,单个字符被有效地取代。 因此,假设你有更高级别的定义:

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

令牌的匹配<STRING>将是三个字符:引号,后跟一个换行,随后是引号。 你似乎想要代替什么是被承认的转义序列:

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

现在令牌的匹配<STRING>将是四个字符:引号,后面是表示换行的转义序列,随后是引号。

在当前的定义,我看到像引号和反斜杠等经常转义元字符也被字面上的认可,而不是转义序列。



文章来源: How to use backslash escape char for new line in JavaCC?