我假设您正在使用 JavaCC。答案取决于您的语言中字符串的语法。假设除撇号之外的字符串中允许使用任何字符。即一个字符串由两个撇号和任意数量(0 个或更多)之间的非撇号组成。
<STRING: "'" (~["'"])* "'">
现在许多语言不允许换行符或字符串中的返回。所以在这里让我们也禁止这些:
<STRING: "'" (~["'","\n","\r"])* "'">
现在的问题是:如果有人想添加撇号、换行符或回车符怎么办?某些语言(例如 C)使用反斜杠作为转义,所以让我们说
- \' 表示撇号
- \n 表示换行符
- \r 表示返回
- \\ 表示反斜杠
- \x 其中 x 是任何其他字符被视为错误
这是表达式
<STRING: "'" ("\\" ("\\" | "n" | "r" | "'") | ~["\\","\n","\r","'"] )* "'"
即一个字符串是两个撇号,其间有 0 个或多个组的序列,其中每个组是两个字符序列 \\、\n、\r、\' 之一,或者不是反斜杠的字符,a换行符、回车符或撇号。
另一种方法是使用词汇状态。
<DEFAULT> MORE: { "'" : INSTRING }
<INSTRING> MORE: { "\\\\"
| "\\n"
| "\\r"
| "\\'"
| ~["\\","\n","\r","'"]
}
<INSTRING> TOKEN: { "'" : DEFAULT }