编译器设计帮助。

5

可能重复:
学习编写编译器

我需要设计一个类似于SQL的虚拟语言,但功能非常有限。我以前从未做过编译器或解析相关的工作。有人能告诉我一个好的起点,比如一个链接或相同的示例吗?我一点头绪都没有。

我将使用C/C++作为我的主要语言来使用这个虚拟语言。

谢谢


这是一个相当奇怪的请求。你能解释一下为什么这很有用吗? - Ira Baxter
@Ira:我正在编写一个应用程序,它使用sqlite3作为数据库。数据库中填充了XML内容,并使用嵌套模型逻辑进行存储[http://en.wikipedia.org/wiki/Nested_set_model]。为了查询这个数据库,我需要想出一种虚拟的SQL语言,最终将转换为复杂的SQL语句并查询我的数据库。使用SQL查询数据库将是不可重用的。 - keeda
1
如果你以前从未做过编译器或解析相关的工作,为什么你认为自己已经准备好设计一个有效的查询语言(语法、语义、语用、表达能力)?如果你正在存储XML,你最好使用XPath(你已经知道它被设计得很好)作为查询语言,并将其转换为你正在存储的模式,或者直接将XML存储在数据库中。这仍然让你面临解析XPath和将XPath转换为SQL调用的问题,这对于没有经验的人来说可能会非常困难。只是试图保持现实。 - Ira Baxter
1
我很难理解这个。所以人们拒绝使用XPath,是基于一种假设:存在某种未知但可定义的查询符号,可以提供更好的效率,并将设计和实现这种语言的工作交给了你这个语言设计者/实现者新手?看,我不是要打击你的积极性,但我认为你面临的挑战相当大。 - Ira Baxter
如果你是一名实习生,那么很可能没有人依赖于你的真正成功。在这种情况下,如果他们给你机会去玩这个(我认为他们疯了,但这是他们的问题),那么你绝对应该去尝试。既然我了解到了具体情况,我愿意支持你的学习活动。我会建议你首先询问XPath被认为是缓慢的原因; 你不希望你的解决方案出现相同的问题。我怀疑无论你做什么,都会遇到效率低下的问题;关系型数据库和树形结构(如XML)通常都是效率低下的。 - Ira Baxter
显示剩余2条评论
3个回答

2
“龙书”通常被认为是一个很好的起点。不过,我也会推荐“ANTLR书”。

1

所以你想设计一种新的语言,为它构建一个解析器,然后将结果转换为SQL调用。

你应该查看解析器生成器,特别是解析器生成器比较的链接。

在设计语言时,你需要选择最强大、最易于使用的解析器生成器来测试你的语法,因为你会经常进行更改。如果你选择了一个弱的解析器生成器,你可能会发现自己花费更多的精力来重新塑造语法,以使解析器生成器工具满意,而不是考虑什么语法是有意义的。

但是一旦拥有了一个定义良好、可解析的语言,你会发现还有很多超越解析的生命。

在实现语言时,你需要捕获它的内部表示(例如解析树或AST),找到一种方法来分析它的特殊情况,并将其转换为你的输出语言。总的来说,解析器生成器工具在这里并没有帮助你,而这却是问题的难点。而且,构建所有这些额外的东西比大多数人想象的要困难得多。

你实际上想要的是一个集成的工具系统,可以解析、构建AST,分析它们,翻译等等。这样的工具并不多见。我们的 DMS软件重构工具包 提供了所有必要的基础设施。你可能不想真的使用它,但你应该知道这种工具,以便可以自主选择是否亲自完成所有工作。

0

我去年学习了编译器构造课程,我们使用了这本书:

《Compiler Construction》by Kenneth C. Louden

这本书非常详细,具有良好的理论背景。同时,作者提供了足够的例子和使用了非常信息丰富的图表,使您在学习过程中永远不会迷失方向。最终,在后面的章节中列出了一个玩具语言的C编译器。

我真的很喜欢它!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接