Compiler construction 如何定义编程语言的语法

Compiler construction 如何定义编程语言的语法,compiler-construction,programming-languages,grammar,context-free-grammar,Compiler Construction,Programming Languages,Grammar,Context Free Grammar,如何为要从头开始设计的新编程语言(命令式编程语言)定义语法(无上下文) 换句话说:当你想从头开始创建一种新的编程语言时,你该如何进行呢?看一看,也许这就是你想要的?你会想看一看EBNF() (假设您想编写一种上下文无关的语法。)在开始设计编程语言之前,您需要对编程语言有相当多的了解。我推荐。如果你的意思是定义语法,最好从现有的语言开始,修改它的语法,使之与你所追求的语言相匹配。创建语法规范是一个相当机械的练习,在自己的头脑中使用一组模式。例如,if语句是什么样子的?它看起来像C吗 if一次一步

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


换句话说:当你想从头开始创建一种新的编程语言时,你该如何进行呢?

看一看,也许这就是你想要的?

你会想看一看EBNF()


(假设您想编写一种上下文无关的语法。)

在开始设计编程语言之前,您需要对编程语言有相当多的了解。我推荐。

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

if一次一步

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

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

要检查语法是否有意义,请将重点放在某个级别(文字/变量、运算符、表达式、语句、函数等),并确保其他级别的标点符号和标记穿插或附加/前置不会造成歧义

最后在EBNF中写出所有内容,并通过ANTLR或类似程序运行

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

当然,您必须找到一个非常有说服力的理由,不要放弃编写一种新的语言,只需坚持使用经过良好测试和大量使用的C、ECMAScript或Basic即可

我经常开始定义新的语言,却发现其他人已经在某些现有语言的某个地方实现了一个特性


如果您的目标是加快某些特定项目的开发速度,那么如果您希望快速启动并运行,并且希望减少大多数编译语言中所需的键入量,那么最好使用Python、Lua或SpiderMonkey之类的东西进行原型设计。

为编程定义?如果你能给我们提供更多的信息,也许你能给我们更多的参考。您提到编译器是一个标记。你是在为一种新的编程语言编写编译器吗?EBNF只在表达CFG时有用,而不是在实际设计中;一个关于如何实现它的问题肯定会涉及到大量包含lex/yacc(或flex/bison)的答案——在这种情况下,yacc/bison语法与EBNF相去甚远。此外,实现一种语言(在学术或实践层面)与实现(比如)链表不同。需要有一个强大的理论基础,或者所有的<代码>移位/减少< /代码>冲突将是令人困惑的。而且EBNF是一个很好的去处,IMHO。与ANTLR或RACKT相比,Bison已经完全过时了。您可以解释第三步(
确保其他级别的标点符号和标记穿插或附加/前置不会引起歧义。
)如何实现这一点?单个构造可以很好地工作,但当它们组合在一起时,就会导致冲突。我正在使用
YACC/BISON
作为编译器构造工具。