【问题标题】:Any reason I couldn't create a language supporting infix, postfix, and prefix functions, and more?有什么原因我不能创建支持中缀、后缀和前缀函数等的语言?
【发布时间】:2010-09-30 10:25:12
【问题描述】:

我一直在考虑创建一种非常适合创建 DSL 的语言,方法是允许定义中缀、后缀、前缀甚至由多个单词组成的函数。例如,您可以如下定义中缀乘法运算符(其中 multiply(X,Y) 已定义):

a * b => multiply(a,b)

或后缀“平方”运算符:

a squared => a * a

或者是 C 或 Java 风格的三元运算符,其中包含两个关键字,其中散布着变量:

a ? b : c => if a==true then b else c

显然,这种语言有很多歧义,但如果它是静态类型的(使用类型推断),则可以消除大多数歧义,而剩下的可能被视为语法错误(由在适当的地方添加括号)。

是否有一些我看不到的原因会使这变得极其困难、不可能,或者只是一个糟糕的主意?

编辑: 很多人向我指出了可能执行此操作或类似操作的语言,但我实际上对如何实现我自己的解析器的指针感兴趣,或者如果这样做我可能会遇到的问题。

【问题讨论】:

    标签: parsing syntax programming-languages infix-notation postfix-notation


    【解决方案1】:

    这并不难做到。您需要为每个运算符分配一个fixity(中缀、前缀或后缀)和一个precedence。将优先级设为实数;你以后会感谢我的。较高优先级的运算符比较低优先级的运算符绑定得更紧密;在同等优先级下,您可以要求用括号消除歧义,但您可能更愿意允许某些运算符是 associative 以便您可以编写

    x + y + z
    

    没有括号。一旦为每个运算符确定了固定性、优先级和关联性,您就需要编写一个运算符-优先级解析器。这种解析器写起来相当简单;它从左到右扫描令牌并使用一个辅助堆栈。龙书有解释,但我一直没觉得很清楚,部分原因是龙书描述了一个非常普遍的运算符优先级解析案例。但我认为你不会觉得这很困难。

    你需要注意的另一种情况是当你有

    prefix (e) postfix
    

    其中prefixpostfix 具有相同的优先级。这种情况还需要括号来消除歧义。

    我的论文Unparsing Expressions with Prefix and Postfix Operators 后面有一个示例解析器,你可以下载代码,但它是用 ML 编写的,所以它的工作原理对于业余爱好者来说可能并不明显。但是对固定性等整个业务进行了非常详细的解释。

    【讨论】:

      【解决方案2】:

      你打算如何处理操作顺序?

      a * b squared
      

      【讨论】:

      • 好问题。我想也许可以通过某种方式来指定运算符优先级,如果仍然不明确,则会出现语法错误。
      【解决方案3】:

      你可能想看看 Scala,它对运算符和方法有一种独特的方法。

      【讨论】:

      • 我更感兴趣的是如何为这类事情实现我自己的解析器,或者我在这样做时可能遇到的问题。
      【解决方案4】:

      Haskell 正是您想要的。

      【讨论】:

      • 我很确定 Haskell 除了 '-' 之外不做前缀运算符,我也不确定后缀 - 更不用说更复杂的结构了。无论如何,我正在寻找创建这样一种语言,而不仅仅是找到一种。
      • Haskell 中函数固定性的实现可能会影响如何用您自己的语言实现它。
      猜你喜欢
      • 1970-01-01
      • 2021-10-21
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2017-05-04
      • 2020-01-06
      相关资源
      最近更新 更多