为什么Forth的灵活性使语法不适合它?


10

我最近承担了编写基于堆栈的编程语言的任务。但是,在开始设计语言之前,我认为阅读和尝试现有的基于堆栈的语言是一个好主意。

这把我带到了这篇文章的主题。我正在阅读有关ForthWikipedia文章,Forth是一种使用后缀样式表达式的基于堆栈的语言。在文章中,我看到了以下语句:

Forth的灵活性使静态BNF语法不合适,并且它没有整体编译器。扩展编译器只需要写一个新词,而不需要修改语法和更改基础实现。

据我了解,在Forth术语中,“单词”一词基本上与“子例程”同义。鉴于此,上述说法似乎很奇怪。为什么在Forth中创建新功能的能力会导致Forth的正式语法不合适?为什么需要为定义的每个新子例程重新编写语法?在环境中写一个新单词如何构成扩展编译器?上面的陈述似乎类似于说正式语法不适合Python,因为您可以定义新函数。

实际上,我决定尝试为下面的Forth的一个简单子集编写BNF样式语法:

program        ::= stmt+
stmt           ::= func | expr
func           ::= ':' expr+ ';'
expr           ::= INTEGER | word
word           ::= ('+' | '-' | '*' | '/' )

上面的语法似乎涵盖了Forth语句的有效子集,并且似乎很难扩展到涵盖Forth语言中的所有有效语句。此外,如果编译器的解析器实现了上述语法,我将看不到如何扩展该编译器。编译器只会在其环境中添加任何新词。环境被更改。似乎以上来自Wikipedia的摘录似乎正在将构成编译器(不会更改)的下划线代码编译器的环境(确实会更改)进行混合。

总而言之,为什么福斯(Forth)定义新词(子例程)的敏捷性不适合书面语法?


1
在这种情况下,“不合适”是一个有力的词。一个更好的词可能是“不必要的”。
罗伯特·哈维

1
哦,好吧@RobertHarvery。但是,如果是这种情况,那么我引用的摘录似乎适用于大多数语言。从技术上讲,永远不需要语法,但是拥有语法是一件很不错的事情-尤其是在手写解析器时。
克里斯汀·迪恩

但是在大多数语言中,解析器不是一个可以由用户代码更改的简单运行时库,因此会影响下一行的解析方式。
约尔格W¯¯米塔格

Answers:


10

“正常”一词几乎只是一个子例程。

...但是您可以编写一个用户定义的定义字,它会更改编译器的工作方式。例如,定义通常以冒号(“:”)开头,以分号(“;”)结尾。但是,如果愿意,您可以(例如)更改冒号的功能,并在此过程中更改单词定义的“编译”方式,从而更改编译器的工作方式,并更改被识别语言的语法。

这就是为什么说语法不合适的原因-语法可以从字面上从程序的一部分更改为另一部分。加载字典不仅可以更改当前可识别其名称的子例程,还可以更改定义新单词时解析的语法。


2
您确定Forth的此属性确实会改变语法,而不仅仅是语义吗?
布朗

@DocBrown:大多数使用Forth的人都非常喜欢它,因此他们通常只对手头的任务进行必要的最小改动。那些有野心(并且很疯狂)的人可以根据需要完全更改语法,例如,如果他们想足够的话,可以使用后缀表示法而不是后缀。
杰里·科芬

@DocBrown您可能会编写哪种语法,该语法使我可以在Forth中编写C解释器,然后突然在程序中间切换到C?
user253751

@immibis:好吧,我的问题是-Forth真的允许这样的事情吗?从该链接的文章来看,这对我而言并不是固有的。
布朗

@DocBrown是的。您可以在编译时运行代码,这意味着如果您愿意,可以完全接管编译器。基本上,您可以在Forth编译器/解释器的中间运行C编译器/解释器。(您是否要最终返回到Forth取决于您)
user253751 '18

3

在Forth中,您可以在编译时运行代码。

特别是,您可以运行使用输入中的单词的代码。例如,您可以用Forth编写C编译器,然后在编译时调用它,然后用C编写其余的程序。

更常见的是,您可以定义从源代码读取参数的单词。传统上,您将以与编译器相同的方式读取单词,但这不是必需的。

例如,."单词(打印一个字符串)直到下一个空格才读,直到下一个空格才读"。如果您尝试在: PRINTHELLO ." Hello ; : func2 world!" ;没有特殊情况的情况下解析代码.",则会发现它没有正确解析。

您当然."可以在语法中添加一个特殊情况,但是如果程序员定义自己的单词,语法仍然是不正确的."-例如以下示例:: MY_PRINT POSTPONE ." ; IMMEDIATE。这个词相当于."; 我可以写MY_PRINT Hello ; world! ",您的语法需要能够解析它。祝你好运。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.