我正在尝试编写解析器,我需要识别字符串文字,如果我的字符串以'(即单引号)开头和结尾,那么识别字符串文字的正则表达式是什么?
我正在使用javacc编写解析器。任何人都可以帮助我使用令牌格式的实际正则表达式代码?我已经自己尝试了。
例如
< INTEGER_VALUE:“0”| ([“1” - “9”]([“0” - “9”])*)>
这是识别整数文字的标记格式,我想要字符串文字的相同标记格式,其中字符串以单引号开头和结尾,我也尝试使用元字符(在http://www.vogella.com/articles/JavaRegularExpressions/article.html教程中给出)但没有成功结果
答案 0 :(得分:1)
我假设你正在使用JavaCC。答案取决于您的语言中字符串的语法。假设除撇号之外的任何字符串都允许使用任何字符。即一个字符串由两个撇号组成,其间包含任意数量(0个或更多)的非偶极子。
<STRING: "'" (~["'"])* "'">
现在许多语言不允许换行符或字符串返回。所以在这里我们也禁止它们:
<STRING: "'" (~["'","\n","\r"])* "'">
现在的问题是:如果有人想放撇号,换行符或退货怎么办?有些语言(例如C)使用反斜杠作为转义,所以让我们说
这是表达式
<STRING: "'" ("\\" ("\\" | "n" | "r" | "'") | ~["\\","\n","\r","'"] )* "'"
即。一个字符串是两个撇号,其间有一个0或更多组的序列,其中每个组是两个字符序列之一\\,\ n,\ r,\',或者不是反斜杠的字符,换行符,返回或撇号。
另一种方法是使用词汇状态。
<DEFAULT> MORE: { "'" : INSTRING }
<INSTRING> MORE: { "\\\\"
| "\\n"
| "\\r"
| "\\'"
| ~["\\","\n","\r","'"]
}
<INSTRING> TOKEN: { "'" : DEFAULT }
答案 1 :(得分:0)
不够接近,让我们考虑以下
// 'here is comment'
'is't correct string?'
你有单引号,但它不是一个确定的字符串。如果你确保删除注释,并且引号之间的任何符号都将被转义为''(就像在大多数编程语言中一样)。我相信一切都会像你描述的算法一样好。