使用yacc文件检测Java

时间:2016-07-12 13:41:13

标签: java parsing yacc

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

我看到它的方式我有三个选择:

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

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

    < / LI>
  3. 正如我所看到的,第三个选项是学习YACC和另一个我可以在Java中使用的解析器生成器并重写整个内容。学习新事物从来都不是坏事,但由于我的时间不是无穷无尽的,而且这些“编译器编译器”似乎有一个相当陡峭的学习曲线,我只想投入时间,如果没有办法使用YACC直接定义。 正如我发现那里有很多潜在的选择,在JavaCC,Jacc,CUP,ANTLR4和其他很多其他选项之间,我想选择一个尽可能接近yacc的选项来缩短实现时间。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

A&#34; yacc&#34;语法包括目标语言中的语义规则;如果你有一个现有的语法,语义规则可能会用C编写.Yacc语法也依赖于扫描程序的存在,通常用flex(或JFlex for Java创建)非常相似的方式)。

为了使用基于Java的解决方案,即使是使用相同语法语法的解决方案,您还需要重写现有yacc语法中的所有语义操作,并重写随附的扫描程序。 BYacc / J也是如此;你不能只是向解析器生成器提供一个C-targetted yacc语法文件,并希望得到一个正常运行的Java解析器。

所以你肯定需要了解yacc / bison / flex是如何工作的。

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