【问题标题】:javacc (ph-javacc-maven-plugin) generates java switch with case `\`javacc (ph-javacc-maven-plugin) 使用 case `\` 生成 java 开关
【发布时间】: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


【解决方案1】:

观察到的行为是一个问题,将在parser-generator-cc 1.1.0 中解决。

【讨论】:

    猜你喜欢
    • 2013-12-13
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多