如何为编程语言定义语法

Ayo*_* M. 24 compiler-construction grammar programming-languages context-free-grammar

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

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

mar*_*inr 26

一步一步来.

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

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

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

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

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

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

我经常开始定义新语言,但发现其他人已经在现有语言的某个地方实现了某个功能.

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


Chr*_*son 9

你想看看EBNF(Extended Backus-Naur Form).

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

  • OP想要定义一个语法; 询问如何实施它的问题肯定会涉及包含lex/yacc(或flex/bison)的健康剂量的答案 - 在这种情况下,yacc/bison语法与EBNF相距甚远.此外,实施一种语言(例如在学术或实践层面上)与实施链接列表不同.需要有一个强大的理论基础,或者所有那些"转变/减少"的冲突都会令人困惑.恕我直言,EBNF是一个让你的脚湿透的好地方. (3认同)

小智 5

你需要购买这两本书语言实现模式:创建你自己的领域特定和通用编程语言(实用程序员)权威Antlr参考:构建领域特定语言(实用程序员)他们拥有你真正需要的一切来开始创建您自己的语言,解析器,翻译器,解释器和/或编译器