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

时间:2010-06-09 17:46:41

标签: c programming-languages project

最近,我在寻找有关今年夏天我可以使用C构建的内容的想法,我发现了这篇文章:Interesting project to learn C?

  

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

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

14 个答案:

答案 0 :(得分:6)

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

5 + 10 * 3

并打印答案。然后你可以进行添加变量,控制流程,甚至函数。

答案 1 :(得分:5)

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

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

答案 2 :(得分:5)

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

你可以写一个解释器来解析像

这样的字符串
integer x
integer y
set x, 2
set y, 5
add x, y // x = x + y
print x

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


一个例子,Another World(老式游戏)
脚本编辑器:

alt text

答案 3 :(得分:4)

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

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

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

答案 4 :(得分:3)

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

很多人说Dragon Book是最好的书籍之一。也许你可以看看它:)

祝你好运!

答案 5 :(得分:1)

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

  • “Compiler Construction”(可用here)简要介绍了构建编译器的技巧。
  • “算法+数据结构=程序”(不幸的是绝版),在他的最后一章中提出了一种更简单的语言(名为PL / 0)。

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

答案 6 :(得分:1)

前段时间我用Java编写了一个简单的语言解析器,主要是评估数学表达式,替换常量和变量,并提供一些语法/类型错误的反馈。

我发现做这种事情的最简单方法是制作一个parse tree。这可以通过使用两个堆栈,操作员堆栈和结果堆栈轻松完成。 之后你可以使用DFS递归地解析它,如果你决定用面向对象的语言实现它,可以使用visitor pattern

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

以下是第一部分:v0.1 - Integers

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

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