2016-08-19 56 views
0

我定义的语法规则一样我需要使用包含单引号的JavaCC的解析字符串作为

TOKEN : { < SINGLE_QUOTE : " ' " > } 

TOKEN : { < STRING_LITERAL : " ' " (~["\n","\r"])* " ' "> 

字符串的一部分,但我不能够解析序列像“re'd”。我所需要的解析器将re'd解析为字符串文本。但解析器分别对这些规则解析're'和'd'。

回答

1

下面应该工作:

TOKEN : { < SINGLE_QUOTE : "'" > } 
TOKEN : { < STRING_LITERAL : "'" (~["\n","\r"])* "'"> } 

这是一个很值得你有什么,但我删除了一些空间。

现在,如果一行上有两个撇号(即没有插入换行符或返回值),那么这些撇号的第一个和最后一个以及所有之间的字符应当作为一个STRING_LITERAL标记进行简化。这包括所有中间的撇号。这是假设没有其他规则涉及撇号。例如,如果您的文件是're'd',应该将其作为一个令牌;同样'abc' + 'def'应该lex作为一个令牌。

+0

感谢answer.I得到它working.But上述表达式不允许反斜杠(\\)作为string.How的最后一个字符我可以修改表达式允许反斜杠作为字符串中的最后一个字符? –

+0

的确,STRING_LITERAL的最后一个字符不能是反斜杠。最后一个字符必须是撇号。与第一个字符相同。但是,反斜杠可能发生在除第一个和最后一个位置以外的任何位置。例如''\''与STRING_LITERAL匹配。你有没有理由另有想法? –

1

如果需要LEX re'd作为STRING_LITERAL令牌,然后使用以下规则

TOKEN : { < SINGLE_QUOTE : "'" > } 
TOKEN : { < STRING_LITERAL : "'"? (~["\n","\r"])* "'"?> 

我没有看到规则匹配“重”分开。

在javacc中,定义你的词汇规格STRING_LITERAL是以"'"单引号开头。但是你的输入在开始时没有"'"

STRING_LITERAL中添加的"?"使单个“可选”和如果仅存在一个。所以这将匹配您的输入和lex,如STRING_LITERAL

JavaCC的决策规则:

1)的JavaCC将验看最长匹配。 在这种情况下,即使输入以"'"开头,可能的匹配项为SINGLE_QUOTESTRING_LITERAL。第二个输入字符告诉选择哪个令牌STRING_LITERAL。

2.)JavaCC采用在语法中首先声明的规则。 这里如果输入仅为"'"那么即使存在可能的两个匹配SINGLE_QUOTESTRING_LITERAL,它也将被排成SINGLE_QUOTE

希望这将帮助你...

相关问题