编写混合语言解析器
我正在尝试编写一个可以分析混合语言并生成AST的解析器。我首先尝试从头开始在Java中从头开始构建它,并且失败了,因为对于Parser初学者来说,这是一个相当困难的话题。然后我Google搜索并找到了http://www2.cs.tum.edu/projects/cup/examples.php和JFlex。编写混合语言解析器
现在的问题是:什么是最好的办法呢?
例如我有一个Codefile,它包含几个标签,JS代码和一些$ CMS_SET(x,y)$代码。解决这个问题的最好方法是为CUP中所有这些东西定义一个语法,并让CUP根据我的语法生成一个Parser,这个语法可以分析那些混合的语言文件并生成它的AST树?
感谢所有有帮助的答案。 :)
编辑:我需要做的是在Java中...
这个主题是相当困难,即使在这方面的专家,我认为自己是;检查我的生物。
第一个问题是为每种子语言构建单独的解析器。你会发现的第一件事是为特定语言定义解析器实际上很难;您可以阅读“我可以得到X的解析器”或“我该如何修复X的解析器”的SO请求的无尽列表。大多数情况下,我认为这些要求最终不会去任何地方;解析引擎不是很好,你必须扭曲语法和解析器,使它们能够在真正的语言上工作,没有任何“纯HTML”的东西,标准文档不同意,并且你的客户总是有一些转折在他没有准备好的代码中。最后还有与字符集编码有关的故障,换行符的变化以及预处理器使解析分析问题复杂化。 C++预处理器比你想象的复杂得多,你必须拥有这个权利。解决这个问题的最简单方法是找到一些语言已经预定义的解析器生成器。 ANTLR对于现在已弃用的ANTLR3有一大堆;没有保证这些解析器是强大的,更不用说为了您的目的兼容。
CUP不是特别有用的解析器生成器; LL(x)或LALR(x)解析器生成器都不是真正有用的,因为没有真正的语言匹配它们可以解析的东西的类别。结果是:无休止的请求(在SO!上)帮助“解决我的转换 - 减少冲突”或“消除右递归”。唯一经历了时间考验的解析器生成器恕我直言是一个GLR解析器生成器(我听到关于GLL的好消息,但那是相当新的)。我们使用一个完成了40多种语言GLR解析器生成器,包括生产IBM COBOL,完整的C++ 14和Java8。
你的第二个问题是建立AST。您可以手动编写AST构建过程,但当您必须经常更改语法并且/或者您正在有效地考虑许多语法时,该过程会变得很快。你可以用汗水打败你。 (我们选择推动the problem of building ASTs into the parser,所以我们不必在构建语法时投入任何精力;为此,您的解析器引擎必须为您提供此帮助,而且没有任何主流解决方案能够实现这一点)。
现在你需要编写解析器。当需求出现时,你需要有一个调用另一个;当然,你选择的解析器并不是为了做到这一点而设计的,所以你必须扭转它。第一个难题是为解析器提供一些线索,使得输入流中出现子语言,并将解析结果交给子高级语法分析器,并让它将树传回到父解析器的树中,大概带有某种标记,这样你就可以知道树中不同sublangauges之间的转换。你通常可以通过窃听一个语言的词法分析器来做到这一点,当它看到线索时,调用另一个语言的词法分析器;但那么你对它返回的树做了什么?没有办法将该树交给当前解析器并说“集成这个”。你可以通过修改解析机制来解决这个问题。
但是,以上所有问题都不是问题所在。
解析不方便,但只有一小部分你需要以任何有趣的方式分析你的程序;您需要符号表,控制和数据流分析,也许需要进行点对点分析,并且对这些进行工程设计将会扩大上述工作。请参阅我关于“解析后的生活”(google或通过我的博客)的文章,了解您还需要什么。
简而言之,我认为你在“解析”中咬了一大笔任务,甚至没有告诉我们你打算如何处理结果。欢迎你开始走这条道路,但很少人成功;我的团队花费了50多年的博士水平工程学来获得我们的位置,而我们很难完成。
Java不会让解决方案变得更容易或更难;你解决上述所有问题的语言是无关紧要的。
感谢您的相当详细的答案。我想解析不同语言代码的混合,以便能够正确自动配置它。因此,通过将它解析为AST,我可以轻松地通过它的级别*选项卡缩进每个节点来格式化它。此外,因为我是一名医学信息学学生(单身汉),并且在我的第三学期感到无聊,所以我想用它来真正学到一些东西。这个小项目的最终目标是拥有一个解析器,它可以检测每个CodeNode并将其解析为独立于混合语言的树。之后,我可以很容易地格式化。 – Shiuyin 2014-10-28 19:34:28
我没有任何解析器的经验,但我想了解更多。正如我所说,我尝试自己做,并在Java中写了一个“Parser”,它能够处理类型为 的简单标签,但不能做更多的事情。 –
Shiuyin
2014-10-28 19:35:20
如果你的* only *目标是格式化的,那么你就没有解析后的生活问题。您仍然有定义和编写解析器的问题。如果您想了解“自动成型”,请参阅http://stackoverflow.com/a/5834775/120163 – 2014-10-28 22:39:20