我已经定义了像
这样的语法规则TOKEN : { < SINGLE_QUOTE : " ' " > }
TOKEN : { < STRING_LITERAL : " ' " (~["\n","\r"])* " ' ">
但我无法解析像“&#39; d”这样的序列。我需要解析器将re解析为字符串文字。但解析器解析&#39;&#39;单独和&#39; d&#39;单独遵守这些规则。
答案 0 :(得分:2)
如果你需要lex re'd作为STRING_LITERAL标记,那么使用以下规则
TOKEN : { < SINGLE_QUOTE : "'" > }
TOKEN : { < STRING_LITERAL : "'"? (~["\n","\r"])* "'"?>
我没有看到单独匹配“re”的规则。
在javacc中,词法规范STRING_LITERAL
的定义是以"'"
单引号开头。但是你的输入在开始时没有"'"
。
"?"
中添加的STRING_LITERAL
使单个“可选”,如果只有一个。所以这将匹配您的输入和lex为STRING_LITERAL
。
JavaCC决策规则:
1。) JavaCC将寻找最长的匹配。
在这种情况下,即使输入以"'"
开头,可能的匹配项为SINGLE_QUOTE
和STRING_LITERAL
。第二个输入字符告诉哪个标记选择STRING_LITERAL。
2。) JavaCC采用语法中首先声明的规则。
如果输入仅为"'"
,则即使可能存在两个匹配项SINGLE_QUOTE
和SINGLE_QUOTE
,它也会被列为STRING_LITERAL
。
希望这会对你有帮助......
答案 1 :(得分:1)
以下内容应该有效:
TOKEN : { < SINGLE_QUOTE : "'" > }
TOKEN : { < STRING_LITERAL : "'" (~["\n","\r"])* "'"> }
这几乎就是你所拥有的,除了我删除了一些空格。
现在,如果某一行上有两个更多的撇号(即没有插入换行或返回),那么这些撇号中的第一个和最后一个以及它们之间的所有字符应该被作为一个STRING_LITERAL
标记。这包括所有介入的撇号。这是假设没有其他规则涉及撇号。例如,如果您的文件是're'd'
,那么该文件应该作为一个标记;同样'abc' + 'def'
应该作为一个标记。