我需要编写一个编译器.这是大学的家庭作业.老师告诉我们,我们可以使用任何我们想要解析代码的API,只要它是一个好的.这样我们就可以更专注于我们将生成的JVM.
所以,是的,我将用Java编写一个编译器来生成Java.
你知道这个有什么好的API吗?我应该使用正则表达式吗?我通常手工编写自己的解析器,但在这种情况下不可取.
任何帮助,将不胜感激.
正则表达式很适合在编译器中使用,但仅用于识别标记(即没有递归结构).
编写编译器的经典方法是具有词法分析器用于识别的令牌,一个语法分析器,用于识别结构,一个语义分析器,用于识别的意义,一个中间码产生器,一个优化器,并且持续一个目标码发生器.如果使编译器更容易编写,则可以合并或完全跳过任何这些步骤.
已经开发了许多工具来帮助完成这个过程.对于Java,您可以查看
ANTLR - http://www.antlr.org/
Coco/R - http://ssw.jku.at/Coco/
JavaCC - https://javacc.dev.java.net/
SableCC - http://sablecc.org/
我建议使用ANTLR,主要是因为它通过StringTemplate实现了输出生成功能.
更好的是Terence Parr关于同一本书的书是迄今为止用于使用解析器生成器编写编译器的更好的书之一.
然后你有了ANTLRWorks,它可以让你动态地学习和调试你的语法.
最重要的是,ANTLR wiki +文档(虽然不够全面,我喜欢),是一个适合任何初学者的好地方.它帮助我在一周内刷新了关于编译器编写的知识.
看看JavaCC,Java语言解析器.它非常易于使用并且易于掌握
去经典 - Lex + Yacc.在Java中它拼写JAX和javacc.Javacc甚至还有一些Java语法可供检查.
我建议使用像ANTLR这样的元编译器,或者使用简单的解析器组合器库.Functional Java有一个解析器组合API.还有JParsec.这两个都基于Haskell的Parsec库.