如何开始编写一个非常简单的编程语言

最近,我在寻找有关今年夏天我可以使用C构建的想法,我发现了这篇文章: 学习C的有趣项目?

实现编程语言。 这不一定非常难 – 我做了一个不能命名的语言 – 但它会迫使你学习C语言的很多重要部分。如果你不想写一个词法分析器和/或解析器你自己,你可以使用lex / flex和yacc / bison,但是如果你打算这样做,你可能想要从一个更小的项目开始。

我对实现编程语言答案很有兴趣,我想知道如何开始这个? 我已经阅读了整本K&R书,我也完成了一些练习。 如果重要的话,我在C ++和Java方面也有一些经验。 有小费吗? 谢谢!

了解正则表达式,语法和良好的解析器生成器。

即使您最终实现自己的解析器,这些也是实现任何编程语言的基本概念。

我从一个简单的桌面计算器程序开始,可以读取如下内容:

5 + 10 * 3

并打印答案。 然后你可以进步它来添加变量,控制流,甚至function。

从一个非常简单的(玩具)语言开始; 稍后您可以创建更复杂的语法。

你可以写一个解释器来解析字符串,比如

 integer x integer y set x, 2 set y, 5 add x, y // x = x + y print x 

并立即评估每一行。 如果将行存储在向量中,则可以使用goto命令轻松实现循环。


一个例子, 另一个世界 (老式游戏)
脚本编辑器:

替代文字

我可以这样说,我见过很多人问过“如何制作编程语言?”之类的问题。 或者“制作编程语言有多难”,大多数答案只是告诉他们你必须经历多年的大学阅读,才能阅读1000页以上的书籍。 我在这里告诉大家你可以发布这些答案,但是在制作编程语言的过程中它根本没有帮助。 我16岁,已经做了近两年的编程,我编写了编程语言。 相当先进的面向对象的,但我没有看过任何书籍,没有我做了8年的大学。 为了让人们开始,这是一个用C#编写的简单编程语言:

 string code = "print Hello World"; foreach (string a in code.Split('\n')) { if (a.StartsWith("print ")) { Console.WriteLine(a.Substring(6)); } } 

任何了解基本C#的人都应该能够理解这一点。 没有一些编程经验,你无法开始编程语言。 确保你学习了一门编程语言,并确保你对它有很多了解,然后开始编写简单的一些代码,就像我发布的那样,通过实验和练习,你将开始编写一些复杂的编程语言。时间 :)

好吧,我认为这样的事情真的很难做,但它也是一个很棒的宠物项目。 你应该有解析器,词法分析器,流程控制,范例(命令式,function性,OO)和许多其他东西的概念。

许多人说龙书是最好的书籍之一。 也许你可以看一下:)

祝好运!

你可以阅读Niklaus Wirth撰写的一些写得很好的论文:

  • “Compiler Construction”( 此处提供 )是对构建编译器的艺术的简短简介。
  • “算法+数据结构=程序”(遗憾的是绝版)在他的最后一章中提出了一种更简单的语言(名为PL / 0)。

虽然这些论文主要用Pascal编写,但暴露的概念很容易翻译成C.

我不久前在Java中创建了一个简单的语言解析器,基本上是评估数学表达式,替换了常量和变量,并提供了一些关于语法/类型错误的反馈。

我发现做这种事情的最简单方法是制作一个解析树 。 这可以通过使用两个堆栈,一个运算符堆栈和一个结果堆栈轻松完成。 之后你可以使用DFS递归地解析它,如果你决定用面向对象语言实现它,可以使用访问者模式 。

关于这些事情有很多话要说,如果你想我可以更深入地解释它们,我没有,因为我认为你想尝试自己实施上述,但如果你这样做,请通知我我们可以聊聊

来自Scratch的Scheme是关于在C中实现Scheme的一系列博客文章。这些代码非常易读,每个版本都以前一个版本构建,并且易于遵循。

这是第一部分: v0.1 – 整数 。

另一种方法是在不查看其他任何内容的情况下构建语言。 弄清楚你可以轻松做什么,然后从那里开始。 例如,您可以将表达式解析为标记列表,用空格分隔,并使用前缀表示法(这很容易处理)。 这种事情带来了巨大的乐趣,你可以从实验中学到很多东西。

如果您说法语,您可能会对我的同事课程(免费提供)感兴趣http://matthieuamiguet.ch/scientifique/enseignement/langages-et-compilateurs尽管他使用Python来解释语言构建和编译的概念。

来自PyCon 2010的英文PDF http://matthieuamiguet.ch/assets/files/scientifique/publis/TeachingCompilersWithPython_Paper.pdf

我可能要和他谈谈将他的信息翻译成英文8)

一个旧的编译器教程就是这个 。 虽然它在Pascal中,但它是一个非常好的信息来源。 如果你想要更新的东西,你应该看看ANTLR 。

为了简单起见,我建议使用简单的后缀语言。 FORTH或PostScript的核心部分将是很好的选择。

阅读usenet新闻组comp.compilers上的post,可以通过Google网上论坛访问。 它有很多关于构建语言,构建编译器,lex / yacc,语法等的讨论。 当然,你必须熟悉经典知识,例如龙书,关于编译器的许多书籍中的老虎书,以及关于算法和数据结构的好书。

原始C编译器正在重获新生。 其中大部分内容正在被重写,其代码库足够小,可以在暑假中阅读和理解。 考虑阅读代码以及用于编写此代码或任何正在运行的编译器的代码的文章,我相信您可以了解从哪里开始,等等。

让其他人为你做脏工作,即词法分析器和解析器。 使用cup,yacc或bison来处理语法。 这将使您专注于更重要的语言设计决策。 甚至还有许多语言的示例解析器定义,您可以将它们用作您的模板。