首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为混合语言编写分析器

为混合语言编写分析器
EN

Stack Overflow用户
提问于 2014-10-28 15:16:17
回答 1查看 216关注 0票数 1

我正在尝试编写一个解析器,它可以分析混合语言并生成它的AST。我第一次尝试用Java从头开始构建它,但是失败了,因为对于一个解析初学者来说,这是一个相当困难的话题。然后我搜索并找到了http://www2.cs.tum.edu/projects/cup/examples.php和JFlex。

现在的问题是:做这件事的最佳方法是什么?

例如,我有一个Codefile,它包含几个标记、JS代码和一些$CMS_SET(x,y)$ Code。解决这个问题的最好方法是为CUP中的所有东西定义语法,让CUP生成一个基于我的语法的分析器,它可以分析那些混合语言文件并生成它的AST树?

感谢所有有帮助的答案。:)

编辑:我需要用Java.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-28 16:14:05

即使是在这个领域的专家来说,这个话题也是相当困难的,我认为我自己就是,看看我的个人资料。

第一个问题是为每个子语言构建单独的解析器。首先您将发现,为特定语言定义解析器实际上是很困难的;您可以阅读无穷无尽的SO请求列表,例如“我可以为X获得一个解析器”或“如何为X修复我的解析器”。大多数情况下,我认为这些请求最终不会有任何结果;解析引擎不是很好,你必须扭曲语法和解析器才能让它们在真实语言上工作,没有“纯HTML”这样的东西,标准文档不一致,客户的代码总是有一些你没有准备好的地方。最后,还有与字符集编码、换行符变化和预处理有关的故障,从而使解析问题复杂化。C++预处理器比您想象的要复杂得多,您必须有这个权利。克服这个问题的最简单的方法是使用已经预先定义的语言找到一些解析器生成器。ANTLR为现在不推荐的ANTLR3提供了一堆;不能保证这些解析器是健壮的,更不用说为您的目的兼容了。

CUP不是一个特别有用的解析器生成器;LL(x)或LALR(x)解析器生成器中没有一个是真正有用的,因为没有真正的langauge匹配它们可以解析的内容类别。其结果是:源源不断的请求(就这样!)寻求帮助“解决我的轮班-减少冲突”,或“消除正确的递归”。唯一经得起时间考验的解析器生成器IMHO是GLR解析器生成器(我听说了GLL的优点,但这是最近的)。我们使用一个GLR解析器生成器完成了40+语言,包括生产IBM、完整C++14和Java8。

您的第二个问题将是构建ASTs。您可以手工编写AST构建过程的代码,但是当您必须经常更改语法和/或在有效地考虑时有许多语法时,这会很快变老。你可以用汗水冲破这条路。(我们选择了推动the problem of building ASTs into the parser,这样我们就不必在构建语法上投入任何精力;要做到这一点,解析器引擎必须为您提供这种帮助,而主流引擎中没有一个提供这种帮助。)

现在您需要编写解析器。您需要在需要时调用另一个;当然,您所选择的解析器不是为此而设计的,因此您将不得不扭曲它。第一个困难部分是为解析器提供输入流中出现一个子语言的线索,并将该解析传递给sublangauge解析器,并让它将一棵树传递回父解析器的树中,可能带有某种标记,这样您就可以知道不同子语言之间的转换在树中的位置。你通常可以通过黑客攻击一种语言的词汇(当它看到线索时)来调用另一种语言来实现这一点,但是接下来你会对它返回的树做什么呢?没有办法将该树交给当前的解析器,并说“集成它”。您可以通过以神秘的方式修改解析机制来解决这一问题。

,但所有这些都不是问题所在。

解析是不方便的,但只有一小部分您需要以任何有趣的方式来分析您的程序;您需要符号表、控制和数据流分析,也许是点分析,而这些分析的工程将淹没上面列出的工作。请看我关于“解析后的生活”(google或通过我的个人简历)的文章,来了解你还需要什么。

简而言之,我认为你只是在“解析”中完成了一项艰巨的任务,而你甚至没有告诉我们你打算如何处理结果。欢迎您从这条道路开始,但是很少有人成功;我的团队花了50多年的PhD级别工程来达到我们的目标,而且我们几乎没有完成。

Java不会使解决方案变得更容易或更难;解决上述所有问题的语言是不相关的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26611916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档