fvu*_*fvu 11

阅读龙书总是一个好主意.但请注意,如果您的语言不是微不足道的话,那么实际上并没有"短暂"的方法.


Pau*_*gar 11

总结:最短的可能是Antlr.

很有诱惑去龙书学习解析理论.但我不认为龙书和你对"理论"的含义有同样的看法.Dragon Book描述了如何构建手写解析器,解析器生成器等,但您几乎肯定希望使用解析器生成工具.

一些人建议使用Bison和Flex(或者他们的旧版本Yacc和Lex).那些是旧的坚定者,但它们不是非常有用的工具.他们的文档本身并不差,只是它在处理使用它们的意外复杂性方面没有多大帮助.他们的内部数据没有很好地封装,很难用它们做任何先进的事情.例如,在phc中,我们仍然没有正确的行号,因为它非常困难.当我们修改语法以包含No-op语句时,它们会变得更好,但这是一个令人难以置信的黑客攻击,这是不必要的.

表面上看,Bison和Flex一起工作,但界面很尴尬.更糟糕的是,每个版本都有很多版本,只能与另一个版本的某些特定版本很好地配合使用.而且,最后我至少检查了哪些版本的文档很差.

编写递归下降解析器很简单,但可能很乏味.Antlr可以为你做到这一点,它似乎是一个非常好的工具集,有益于你在这个项目上学到的东西可以应用于许多其他语言和平台(Antlr非常便携).还有很多现有的语法可供学习.

不清楚你在使用什么语言,但有些语言有很好的解析框架.特别是,Haskell Parsec Library看起来非常优雅.如果你使用C++,你可能会想要使用Spirit.我发现很容易上手,但很难 - 但仍然可能 - 用它做高级的事情.这与我一般的C++经验相符.我说我发现它很容易启动,但后来我已经编写了几个解析器,并研究了编译器类中的解析.

长话短说:Antlr,除非你有一个很好的理由.


Pet*_*ham 5

这取决于你的语言.一些非常简单的语言只需很少的解析,因此可以手工编码; 其他语言使用PEG发生器,如老鼠!(PEG是解析器表达式语法,位于Regex和LR解析器之间)或传统的解析器生成器,如Antlr和Yacc.较不正式的语言需要概率技术,例如链接语法.