如何为新编程语言(命令式编程语言)定义一个上下文无关文法。
换句话说:当你想从零开始创建一个新的编程语言时,该如何进行。
如何为新编程语言(命令式编程语言)定义一个上下文无关文法。
换句话说:当你想从零开始创建一个新的编程语言时,该如何进行。
一步一个脚印。
说真的,从表达式和操作符开始,逐步向上到语句,然后到函数/类等等。保留每种标点符号所用的列表。
同时定义引用变量、数组、哈希、数字文本、字符串文本和其他内置字面值的语法。还要并行定义数据命名模型和作用域规则。
要检查你的语法是否合理,专注于一个级别(文字/变量、操作符、表达式、语句、函数等),确保来自其他级别的标点符号和标记交错或附加/前置不会造成歧义。
最后将所有内容写成EBNF格式,并通过ANTLR或类似工具运行。
此外最好不要重复发明轮子。我通常从选择开始和结束语句块和函数、以及数学运算符等基本上是C、ECMAScript、Basic、基于命令列表或基于XML的语言序列开始。这很有帮助,因为人们习惯使用这些东西。
当然,你必须想出一个相当有力的理由,才能不放弃编写新语言,而只是坚持使用经过测试和广泛使用的C、ECMAScript或Basic。
我经常开始定义新语言,只是发现其他人已经在某个现有语言的某个地方实现了某种功能。
如果你的目标是针对某个具体项目的开发速度,那么在像Python、Lua或SpiderMonkey等地方进行原型设计可能更好,这些编程语言可以快速启动并减少大多数编译语言所需的输入量。
如果您想编写上下文无关文法,那么您需要查看EBNF(扩展巴克斯-诺尔范式)。
(假设您想编写上下文无关文法。)
if <- if(exp) block
if <- if(exp) block else block2
还是像ML?
if <- if exp then block else block end
或者你想像Lua一样使用elseif:
if <- if exp then exp end
if <- if exp then exp (elseif exp)* else exp end
语法和语义编码这些决策。请注意,这些都不太适合在LALR或LL(*)编译器生成器中实现,因为它们是含糊不清的,所以必须进行修改才能实现。