【问题标题】:How to parse lambda term如何解析 lambda 项
【发布时间】:2010-12-11 20:03:52
【问题描述】:

我想解析一个 lambda 演算。我不知道如何解析术语并尊重括号优先级。例如:

(lx ly (x(xy)))(lx ly xxxy)  

我无法找到执行此操作的好方法。我只是看不到适应的算法。 术语由具有类型(APPLICATION、ABSTRACTION、VARIABLE)的结构表示,并且 “结构术语”类型的左右组件。

知道怎么做吗?

编辑

很抱歉再次打扰您,但我真的很想了解。你能检查一下函数“表达式()”,让我知道我是否正确。

Term* expression(){
    if(current==LINKER){
        Term* t = create_node(ABSTRACTION);
        get_next_symbol();
        t->right = create_node_variable();
        get_next_symbol();
        t->left = expression();
    }

    else if(current==OPEN_PARENTHESIS){
        application();
        get_next_symbol();
        if(current != CLOSE_PARENTHESIS){
            printf("Error\n");
            exit(1);
        }
    }
    else if(current==VARIABLE){
        return create_node_variable();
    }
    else if(current==END_OF_TERM)
    {
        printf("Error");
        exit(1);
    }
} 

谢谢

【问题讨论】:

    标签: c parsing lambda lambda-calculus


    【解决方案1】:

    可以通过将应用程序与其他表达式分开来简化:

    EXPR -> l{v} APPL     "abstraction"
         -> (APPL)        "brackets"
         -> {v}           "variable"
    
    APPL -> EXPR +        "application"
    

    与您的方法的唯一区别是应用程序表示为表达式列表,因为abcd 可以隐式读取为(((ab)c)d),因此您可以在解析时将其存储为abcd

    基于此语法,可以创建一个简单的递归下降解析器,只需一个字符前瞻:

    EXPR: 'l' // read character, then APPL, return as abstraction
          '(' // read APPL, read ')', return as-is
          any // read character, return as variable
          eof // fail
    
    APPL: ')' // unread character, return as application
          any // read EXPR, append to list, loop
          eof // return as application
    

    当然,根符号是APPL。作为解析后的步骤,您可以将您的 APPL = EXPR 列表转换为应用程序树。递归下降非常简单,如果您愿意,您可以轻松地将其转换为具有显式堆栈的命令式解决方案。

    【讨论】:

    • 好的,但我真的看不出诀窍。你可以给我一个例子吗。请。
    • 提供更详细的示例几乎相当于编写代码。是否有特定的部分给您带来麻烦?
    • 语法我看懂了,请你把算法的不同步骤具体说一下。
    • 维基百科上有一个 RDP 的 C 示例:en.wikipedia.org/wiki/Recursive_descent_parser
    • 我真的不明白,在解析 lambda 项时如何构建树??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2013-07-29
    • 2023-03-17
    • 2018-01-14
    • 2021-10-19
    • 1970-01-01
    • 2020-05-09
    相关资源
    最近更新 更多