0

我已经定义了语法规则,例如

TOKEN : { < SINGLE_QUOTE : " ' " > }

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

但是我无法解析像're'd'这样的序列。我需要解析器将re'd解析为字符串文字。但是解析器分别解析're'和'd'来解析这些规则。

4

2 回答 2

2

如果您需要将 re'd 作为 STRING_LITERAL 令牌,请使用以下规则

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

我没有看到单独匹配“re”的规则。

在 javacc 中,词法规范的定义是以单引号STRING_LITERAL开头"'"。但是您的输入没有"'"开头。

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

JavaCC决策规则:

1.) JavaCC 将寻找最长的匹配。 在这种情况下,即使输入以"'"可能的匹配项开头,也是SINGLE_QUOTEand STRING_LITERAL。第二个输入字符告诉选择哪个标记 STRING_LITERAL。

2.) JavaCC 采用语法中首先声明的规则。 在这里,如果输入是 only"'"那么SINGLE_QUOTE即使有两个可能的匹配项,它也会被 lexedSINGLE_QUOTESTRING_LITERAL.

希望对你有帮助...

于 2016-10-16T05:45:32.983 回答
1

以下应该有效:

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

这几乎就是你所拥有的,除了我删除了一些空格。

现在,如果一行中有两个以上的撇号(即没有中间的换行符或回车),那么这些撇号中的第一个和最后一个以及它们之间的所有字符都应该作为一个STRING_LITERAL标记来使用。这包括所有介入的撇号。这是假设没有其他涉及撇号的规则。例如,如果您的文件're'd'应该 lex 作为一个标记;同样'abc' + 'def'应该作为一个标记来使用。

于 2016-08-19T20:36:54.940 回答