【问题标题】:Using a yacc file to detect syntax errors in a text area in Java使用 yacc 文件检测 Java 文本区域中的语法错误
【发布时间】:2016-07-12 13:41:13
【问题描述】:

我有一个很久以前由其他人创建的 yacc 文件。该文件描述了一种自定义语言。我的目标是使用该 yacc 文件为我的 Java 应用程序中的自定义文本区域创建解析器。最终目标是在语法不正确时显示错误。 我目前正在使用 RSyntaxTextArea 可以很好地处理突出显示(基于我自己的实现,而不是 yacc 文件),但是创建一个可以检测用户可能犯的每个可能错误的解析器是一项艰巨的任务。

在我看来,我有三个选择:

  1. 如果我能以某种方式直接在我的 Java 应用程序中使用 yacc 文件,那么最好的情况是。

  2. 如果有一种方法可以将 yacc 文件解析为我可以在 Java 中轻松使用的格式,那么第二个最好的情况是。我找到了 BYACC/J,它从 yacc 文件创建了一个 Java 类,但是我得到的文件充满了语法错误(缺少函数、变量等),所以效果不太好。

  3. 在我看来,第三个选择是学习 YACC 和另一个我可以在 Java 中使用的解析器生成器,然后用它重写整个东西。学习新东西从来都不是坏事,但由于我的时间不是无穷无尽的,而且这些“编译器编译器”似乎有一个相当陡峭的学习曲线,如果没有办法使用 YACC,我只想花时间在上面直接定义。 我发现那里有很多潜在的选择,在 JavaCC、Jacc、CUP、ANTLR4 和可能很多其他之间,我想选择一个尽可能接近 yacc 以减少实现时间。 任何帮助将不胜感激。

【问题讨论】:

    标签: java parsing yacc


    【解决方案1】:

    Bison(最常被误称为“yacc”的“yacc 兼容”解析器生成器)can generate Java parsers。话虽如此,我从未尝试过,所以我不知道你会遇到什么问题。

    “yacc”语法包括目标语言中的语义规则;如果您有现有的语法,语义规则可能会用 C 编写。Yacc 语法还取决于扫描仪的存在,通常使用flex(或JFlex for Java,以非常相似的方式工作)创建.

    为了使用基于 Java 的解决方案,即使是使用相同语法的解决方案,您也需要重写现有 yacc 语法中的所有语义操作,并重写随附的扫描器。 BYAcc/J 也是如此;您不能只向解析器生成器提供一个以 C 为目标的 yacc 语法文件并期望获得一个正常工作的 Java 解析器。

    所以你肯定需要了解 yacc/bison/flex 的工作原理。

    注意:Bison(和朋友)旨在解析语法正确的程序。显然他们可以检测到语法错误,但是从语法错误中恢复以继续解析要困难得多;对于语法高亮,如果可能的话,您肯定希望能够检测到多个错误。所以你很可能会发现你现有的 yacc 语法只是一个开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 2014-08-14
      • 2015-10-01
      • 1970-01-01
      相关资源
      最近更新 更多