有没有一种(简单的)方法来修改某些特定编程语言的语法?

Nik*_*ika 1 syntax programming-languages

这个问题可能是 na\xc3\xafve,所以请随时向我询问澄清。我是从数学背景进入计算机科学的,所以人们一直告诉我像 Haskell 这样的函数式编程语言对我来说会感觉很自然,但我发现很多语言(不仅仅是函数式语言)的语法非常丑陋和不直观。

\n\n

在 Haskell 中,举一个小例子,类型声明是用 编写的::,例如,

\n\n
str :: String \nstr = "Hello, World!"\n
Run Code Online (Sandbox Code Playgroud)\n\n

有什么方法可以让我修改我自己系统中的语法,以便 的功能::可以由其他东西执行,例如:::,或者也许;;,或者更好:is_a:,这样我就可以执行与上面相同的功能:

\n\n
str ::: String \nstr = "Hello, World!"\n
Run Code Online (Sandbox Code Playgroud)\n\n

需要明确的是,如果我修改系统中的语法,我并不担心任何关于共享代码困难的务实问题;我只是想知道理论上是否可以修改编程语言的基本语法,如果可以,如何修改。

\n\n

请随时修改标签,或要求澄清。

\n

jpm*_*ier 5

这是一个非常广泛的主题,您可能会在 Stack Exchange 的软件工程和计算机科学论坛中获得更详细的答案。但我会尝试给出一些建议。

\n\n

显然,我不知道你从数学到编程的知识已经走了多远,所以如果这个答案的某些部分对你来说是显而易见的,请耐心等待。

\n\n

如果您抛开程序员之间交换源代码的需要(在实践中这是一个非常大的问题),您可以定义您想要的任何编程语言语法,...只要您的语法定义是一致的。问题是,确保语言一致性一点也不简单。

\n\n

这意味着:您必须能够以某种方式生成一个可执行的解析器程序,该程序可以读取使用您漂亮的新语法编写的源代码,并生成语法树。机器代码生成和/或直接解释执行从语法树开始。

\n\n

这是 21 世纪,您拥有Yacc/BisonLex/Flex等软件工具,它们将为您编写实际的解析器代码,从提供的语法的一些高级描述开始,通常采用接近 Backus 的方式-瑙尔形式 (BNF)。

\n\n

解析器本质上是一个基于堆栈的自动机。现在,如果您的新语法有可能在某个地方不明确,您的解析器生成器工具将不会生成基于堆栈的自动机的可编译描述。相反,它会输出一些部分不清楚的错误消息,例如第 413 行的移位归约冲突。根据我对工作语言设计者的有限经验来看,他们花了很多时间来解决语法中的移位-归约冲突。

\n\n

例如,您说您可能想要为 \xe2\x80\x9c;;\xe2\x80\x9d 分配一些语义值。但与许多其他编程语言一样,Haskell 为单个分号分配一个既定值。它是一个指令终止符。如何确保我们避免该级别上的任何歧义?通过解析器生成工具获取 BNF。这是唯一的办法。

\n\n

更多详细信息请参见此处。深入理解问题的最佳方法是为某种迷你语言创建一个解析器。您可以使用经典的 Bison/Flex 工具包,它是在传统命令式语言领域生成的。或者您可以使用 Haskell 特定工具之一,例如Megaparsec

\n\n

话虽这么说,您似乎感觉到的丑陋部分可能是由于历史上只使用 ASCII 字符的必要性造成的,因为在过去,这是源代码交换的要求。为了编写不等于,Fortran 使用了 .NE。因为没有 Unicode,因此没有 '\xe2\x89\xa0\' 字符。C 语言的设计者在公元 1975 年左右面临同样的问题,更喜欢使用 \xe2\x80\x9c!=\xe2\x80\x9d。

\n\n

Haskell 在公元 2020 年处于领先地位,默认情况下仍然使用单个普通 ASCII 点“.”来进行函数组合,而不是数学文本中使用的适当的“\xe2\x88\x98\”字符。可能需要很长时间才能解决这个问题。

\n