【问题标题】:Recursive descent parser for calculus of constructions用于构造演算的递归下降解析器
【发布时间】:2018-06-26 22:35:41
【问题描述】:

我使用Megaparsec 使用简单的一元解析器在 Haskell 中实现了类型检查器和构造演算归约器。现在我想改进它,让它能够识别这个语法快捷方式:

∀(x:A)->B (with x not free in B)  =  A -> B

这个语法的语法如下:

<expr>
    = "(" <expr> ")"
    | <expr> <expr>
    | "λ" "(" <name> ":" <expr> ")" "→" <expr>
    | "∀" "(" <name> ":" <expr> ")" "→" <expr>
    | <expr> "→" <expr>
    | <name>
    | "*"

<name> = [_A-Za-z][_0-9A-Za-z]*

我当前的解析器使用这种变体,消除了左递归(没有快捷方式):

<expr>
    = "(" <appl> ")"
    | "λ" "(" <name> ":" <appl> ")" "→" <appl>
    | "∀" "(" <name> ":" <appl> ")" "→" <appl>
    | <name>
    | "*"

<appl> = <expr>+

<name> = [_A-Za-z][_0-9A-Za-z]*

前面提到的快捷方式是左递归的。我不知道如何将其转换为右递归语法,以便可以由传统的递归下降解析器处理。

我知道存在更强大的解析技术可以处理左递归语法,但我想保持它是右递归的,以便在不久的将来留下手动实现解析器的可能性。

【问题讨论】:

    标签: parsing haskell


    【解决方案1】:

    在短暂的休息之后,答案已经很明显了。使用与&lt;appl&gt; 完全相同的技巧并将其扩展如下:

    <expr>
        = "(" <appl> ")"
        | "λ" "(" <name> ":" <appl> ")" "→" <appl>
        | "∀" "(" <name> ":" <appl> ")" "→" <appl>
        | <name>
        | "*"
    
    <appl> = <expr>+ ("→" <appl>)?
    
    <name> = [_A-Za-z][_0-9A-Za-z]*
    

    如果它对某人有帮助,我会留下问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多