如何为编程语言定义语法

时间:2010-02-23 17:44:55

标签: compiler-construction programming-languages grammar context-free-grammar

如何为您想要从头设计的新编程语言(命令式编程语言)定义语法(无上下文)。

换句话说:当您想从头开始创建新的编程语言时,如何继续。

6 个答案:

答案 0 :(得分:26)

一次一步。

不重要的是,从表达式和运算符开始,向上处理语句,然后到函数/类等。保留一个标点符号用于什么。

并行定义语法,用于引用变量,数组,哈希,数字文字,字符串文字,其他内置文字。同时并行定义数据命名模型和范围规则。

检查你的语法是否有意义集中在某个级别(文字/变量,运算符,表达式,语句,函数等),并确保散布或附加/前置的其他级别的标点和标记不会导致歧义。

最后在EBNF中全部写出来并通过ANTLR或类似方式运行它。

最好不要重新发明轮子。我通常首先选择序列来启动和结束语句块和函数,以及数学运算符,它们通常基本上类似C语言,类似ECMAScript,类似于Basic,基于命令列表或基于XML。这对人们习惯的工作有很大帮助。

当然,你必须提出一个非常令人信服的理由,不要放弃编写新语言,只需坚持使用经过充分测试和使用的C,ECMAScript或Basic。

我经常开始定义新语言,但发现其他人已经在现有语言的某处实现了某项功能。

如果您的目标是针对某些特定项目的开发速度,那么如果您希望快速启动并运行并希望减少所需的键入量,则可能会更好地使用Python,Lua或SpiderMonkey等原型。大多数编译语言。

答案 1 :(得分:9)

您需要查看EBNF(Extended Backus-Naur Form)。

(假设你想写一个无上下文语法,那就是。)

答案 2 :(得分:5)

答案 3 :(得分:2)

如果您的意思是定义一个语法,那么最好通过从现有语言开始并修改其语法来匹配您所使用的语法。创建语法规范是一种相当机械的练习,在你自己的头脑中使用一组模式。例如,if语句是什么样的?它看起来像C

if <- if(exp) block

if <- if(exp) block else block2

或像ML?

if <- if exp then block else block end

或者你想使用像Lua这样的其他人:

if <- if exp then exp end

if <- if exp then exp (elseif exp)* else exp end

语法和语义将这些决定编成法典。请注意,这些都不适合在LALR或LL(*)编译器生成器中实现,并且必须按摩以实现,因为它们不明确。

编程语言迈克尔·斯科特的语用学是对编程语言设计的一个很好的介绍。它可以在亚马逊here

上找到

答案 4 :(得分:1)

看看Bison,也许这就是你要找的东西?

答案 5 :(得分:1)

在开始设计语言之前,您需要了解很多关于编程语言的知识。我推荐Programming Languages: Application and Interpretation by Shriram Krishnamurthi

相关问题