0

我正在尝试编写需要识别字符串文字的解析器,如果我的字符串以 ' 开头和结尾(即单引号),那么识别字符串文字的正则表达式是什么?

我正在使用 javacc 编写解析器。任何人都可以帮助我使用令牌格式的实际正则表达式代码吗?我自己已经尝试了足够多。

例如。

<整数值:“0”| (["1"-"9"] (["0"-"9"])*) >

这是标识整数文字的标记格式,我想要字符串文字的相同标记格式,其中字符串以单引号开头和结尾,我还尝试使用元字符(在http://www.vogella.com/articles/JavaRegularExpressions/article中给出.html教程),但没有成功的结果。

4

2 回答 2

1

我假设您正在使用 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 }
于 2013-09-05T14:45:09.817 回答
0

不够接近,让我们考虑以下

// 'here is comment'
'is't correct string?'

你有单引号但它肯定不是字符串。如果您保证去掉注释并且引号之间的任何符号都将被转义 \' (就像在大多数编程语言中一样)。我相信一切都会像你描述的算法一样好。

于 2013-09-04T18:52:54.387 回答