【问题标题】:Error using rascal Java15 grammar使用流氓 Java15 语法时出错
【发布时间】:2016-10-05 23:10:41
【问题描述】:

我尝试使用 Rascal 的 Java15 语法解析一些 Java 代码。但是,它不接受参数化类型的局部变量的声明。更详细的:

  • 识别List<String> files = ...
  • 它识别final List<String> files = ...
  • 它识别List<String, String> files = ...

在我看来,问题与涉及 LocalVarDecStatements 和涉及“”的表达式的一些歧义有关。但是,我不知道如何解决这个问题。

【问题讨论】:

    标签: rascal


    【解决方案1】:

    我不是一个说“为我工作”的人,但它确实 :-) 请参阅:

    rascal>import lang::java::\syntax::Java15;
    ok
    rascal>import ParseTree;
    ok
    rascal>parse(#LocalVarDec, "List\<String\> files = null")
    LocalVarDec: (LocalVarDec) `List<String> files = null`
    

    您能否提供其中有错误的示例或简化示例?

    【讨论】:

    • 这很有趣。当我使用控制台运行您的示例时,它也适用于我。但是当我使用特定文件运行解析器时,它不起作用。示例文件:github.com/refactoring-towards-language-evolution/rascal-Java8/…。请注意,我们正在使用您的语法的 Java8 扩展。但我很确定我们没有更改 LocalVarDec 定义。顺便说一下,当我们完成 Java8 语法后,我们很乐意与您分享。
    • 如果java 8的扩展使用像!>>这样的约束,语法特性完全有可能交互,从而导致解析错误。这些扩展可以使解析器以非严格“上下文无关”的方式运行。请以某种方式分享语法,我们会看看。
    • 语法在这里可用:(github.com/refactoring-towards-language-evolution/rascal-Java8/…)。目前,它支持接口中的默认方法、资源尝试和多捕获。还提供了一个非常实验性的 lambda 表达式版本。如果您愿意,我们还有一个带有一些睾丸的 Rascal 项目:(github.com/refactoring-towards-language-evolution/rascal-Java8)。如果您在访问我们的语法或 Rascal 项目时遇到任何问题,请告诉我。
    • 亲爱的@jurgenv,我解决了这个特殊的问题,改变了ExpressionStatement的定义。我将其更改为排除关系表达式(例如 >、syntax Stm = ... | exprStm : NonRelExpr 和 syntax NonRelExpr = Expr!gt!ltEq!lt!gtEq!eq!notEq;
    • 非常感谢。我决定“从头开始”在 Rascal 中编写 Java8 解析器,使用语法规范(来自 Oracle)和现有的 ANTLR 语法(+ Rascal Java15 语法的一些定义)作为参考。目前它可以识别几乎 95% 的测试套件(或多或少 2000 个来自 Cassandra 和 jEdit 的 Java 文件)。可在github.com/refactoring-towards-language-evolution/rascal-Java8/… 获得。下周我会改进那个语法,它目前没有利用所有 Rascal 特征来消除歧义。
    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    相关资源
    最近更新 更多