gpt4 book ai didi

c - 如何解析 lambda 术语

转载 作者:太空宇宙 更新时间:2023-11-03 23:35:39 24 4
gpt4 key购买 nike

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

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

我没有设法找到执行此操作的好方法。我只是看不到适应的算法。术语由具有类型(APPLICATION、ABSTRACTION、VARIABLE)和“struc term”类型的左右组件。

知道怎么做吗?

编辑

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

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);
}
}

谢谢

最佳答案

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

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

APPL -> EXPR + "application"

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

基于这个语法,可以创建一个简单的递归下降解析器,其中包含一个 lookahead 的单个字符:

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 列表变成应用程序树。递归下降非常简单,如果您愿意,您可以轻松地转换为具有显式堆栈的命令式解决方案。

关于c - 如何解析 lambda 术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4418670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com