自1999年以来,我一直在编程工作和乐趣。我想学习新东西,最近我一直专注于解析,因为我的工作很大一部分是阅读,整合和分析数据。如果开销足够低,我认为我可以用非常简单的特定于域的语言表达大量重复性任务。我对这个问题有几个问题。
答案 0 :(得分:4)
这是我对你(非常好)问题的看法:
GoF Interpreter模式是另一种编写“小语言”的技巧。看一看。
答案 1 :(得分:4)
在1.,我会说主要的优点是可维护性 - 对语言进行一点改动只是意味着对语法进行相应的小改动,而不是微不足道地破解各种语法代码中可能与您想要改变的内容有关的点数...数量级更高的生产力和更小的错误风险。
在2.和3.上,我不能提出超出你已经发现的内容(我主要使用Python和pyparsing
,并且可以根据许多以Python为中心的解析框架的经验进行评论,但对于C ++我无论如何,大多数都使用好的旧yacc
或bison
,而我的旧书的副本 - 实际上不是最新版本 - 就是我为此而保留在我身边的......
答案 2 :(得分:2)
Let's Build A Compiler是关于如何编写简单编译器的分步教程。代码是用Delphi(Pascal)编写的,但它基本上足以轻松翻译成大多数其他语言。
答案 3 :(得分:2)
我会认真研究Haskell中基于monadic组合器的解析(通常也会处理词法分析)。我发现它让人大开眼界;令人惊讶的是,使用此方法可以轻松地从头开始构建解析器。事实上,它很容易编写自己的解析器,而不是尝试使用现有的库。
最着名的例子可能是Parsec,它有一个很好的user guide,可以解释如何使用它。这个库的端口列表是C++上列出的其他语言(包括Ruby和Parsec page of the Haskell wiki),但我不熟悉它们,所以我不能说他们在Haskell中使用Parsec有多接近。
如果你想了解这些内部工作方式以及如何编写自己的工作,我建议从Graham Hutton的Programming in Haskell第8章(“功能解析器”)开始。一旦你理解了那一章(可能需要几个读数),你就会被设定。
答案 4 :(得分:1)
在Perl中,Parse :: RecDescent模块是第一个开始的地方。添加教程到模块名称,Google应该能够找到大量的教程来帮助您入门。
答案 5 :(得分:1)
使用BNF,EBNF或类似方法定义语法更容易,稍后您将有更好的时间来维护它。此外,您可以找到很多语法定义的例子。最后但并非最不重要的一点是,如果你要向场上的其他人谈论你的语法,那么如果你们都说同一种语言(BNF,EBNF等),那就更好了。
编写自己的解析代码就像重新发明轮子一样,容易出错。它也不太可维护。当然,它可以更灵活,对于小型项目,它也可能是一个不错的选择,但使用现有的解析器生成器,它需要语法并吐出代码,应该满足我们的大部分需求。
对于C ++,我也建议使用lex / yacc。对于Ruby来说,这看起来是一个不错的选择:Coco/R(uby)
答案 6 :(得分:1)
有趣的时机:今天早上我花了很多时间来讨论状态机和解析器,并试图弄清楚我如何能够更多地了解它们。
对于2,您可以查看Ragel(这对C ++和Ruby有用)。
答案 7 :(得分:1)
这是一个自包含(10页!),完全可移植的编译器编译器的教程 它可以用来很快地设计和实现“低开销”的DSL:
http://www.bayfronttechnologies.com/mc_tutorial.html
本网站将向您介绍Val Schorre 1964年关于MetaII的论文。 是的,1964年。这太棒了。这就是我学习编译器的方法 早在1970年。