【发布时间】:2018-10-21 11:07:57
【问题描述】:
我是 javacc 的新手。我试图解析现有的 javacc 语法(它的 JSR341, EL 3.0 Grammar)。它生成(几乎)正确的java。但是,生成的代码包含非法的 switch 语句。我正在使用 ph-javacc-maven-plugin。
private int jjMoveStringLiteralDfa0_0(){
switch(curChar)
{
case '#':
return jjMoveStringLiteralDfa1_0(0x8L);
case '$':
return jjMoveStringLiteralDfa1_0(0x4L);
case '\': // should be '\\'
return jjStartNfaWithStates_0(0, 4, 2);
default :
return jjMoveNfa_0(7, 0);
}
}
这是导致问题的 JS341 中的违规语法部分(虽然我不确定它的语法本身):
<DEFAULT> TOKEN :
{
< LITERAL_EXPRESSION:
((~["\\", "$", "#"])
| ("\\" ("\\" | "$" | "#"))
| ("$" ~["{", "$"])
| ("#" ~["{", "#"])
)+
| "$"
| "#"
>
|
< START_DYNAMIC_EXPRESSION: "${" > {stack.push(DEFAULT);}:
IN_EXPRESSION
|
< START_DEFERRED_EXPRESSION: "#{" > {stack.push(DEFAULT);}:
IN_EXPRESSION
}
<DEFAULT> SKIP : { "\\" }
我玩弄了选项(JAVA_UNICODE_ESCAPE、UNICODE_INPUT)和语法。但没有结果。
问题:如何使 javacc 生成有效的 Java switch 语句,即使用 '\\' 而不是 '\'?
【问题讨论】:
-
已经有评论说值应该是什么,你有什么问题?
-
我想你必须展示你的语法。
-
我会用有问题的语法部分来更新问题。事实上,我希望
'\\' -
我无法使用 JavaCC 5.0、6.0 或 6.1 重现该错误。您使用的是什么 JavaCC 版本?你能发布一个最小的独立示例吗?
-
我对分叉不熟悉。我建议向维护人员报告该错误。该错误也可能出现在 JavaCC 的更高版本中。我得调查一下。我认为您可以在生成的 AST 类中添加方法而不会被覆盖。
标签: java el javacc parser-generator