Nik*_*ika 1 syntax programming-languages
这个问题可能是 na\xc3\xafve,所以请随时向我询问澄清。我是从数学背景进入计算机科学的,所以人们一直告诉我像 Haskell 这样的函数式编程语言对我来说会感觉很自然,但我发现很多语言(不仅仅是函数式语言)的语法非常丑陋和不直观。
\n\n在 Haskell 中,举一个小例子,类型声明是用 编写的::,例如,
str :: String \nstr = "Hello, World!"\nRun Code Online (Sandbox Code Playgroud)\n\n有什么方法可以让我修改我自己系统中的语法,以便 的功能::可以由其他东西执行,例如:::,或者也许;;,或者更好:is_a:,这样我就可以执行与上面相同的功能:
str ::: String \nstr = "Hello, World!"\nRun Code Online (Sandbox Code Playgroud)\n\n需要明确的是,如果我修改系统中的语法,我并不担心任何关于共享代码困难的务实问题;我只是想知道理论上是否可以修改编程语言的基本语法,如果可以,如何修改。
\n\n请随时修改标签,或要求澄清。
\n这是一个非常广泛的主题,您可能会在 Stack Exchange 的软件工程和计算机科学论坛中获得更详细的答案。但我会尝试给出一些建议。
\n\n显然,我不知道你从数学到编程的知识已经走了多远,所以如果这个答案的某些部分对你来说是显而易见的,请耐心等待。
\n\n如果您抛开程序员之间交换源代码的需要(在实践中这是一个非常大的问题),您可以定义您想要的任何编程语言语法,...只要您的语法定义是一致的。问题是,确保语言一致性一点也不简单。
\n\n这意味着:您必须能够以某种方式生成一个可执行的解析器程序,该程序可以读取使用您漂亮的新语法编写的源代码,并生成语法树。机器代码生成和/或直接解释执行从语法树开始。
\n\n这是 21 世纪,您拥有Yacc/Bison和Lex/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\nHaskell 在公元 2020 年处于领先地位,默认情况下仍然使用单个普通 ASCII 点“.”来进行函数组合,而不是数学文本中使用的适当的“\xe2\x88\x98\”字符。可能需要很长时间才能解决这个问题。
\n| 归档时间: |
|
| 查看次数: |
955 次 |
| 最近记录: |