switch(p->opr.oper) { case '.': ex(p->opr.op[0]); ex(p->opr.op[1]); ex(p->opr.op[2]); return ex(p->opr.op[3]); case CONST: l_s=g_s; g_s=Const; ex(p->opr.op[0]); g_s=l_s; return 0; case VAR: vartable=malloc(symlen*sizeof(int)); varlen=0; l_s=g_s; g_s=Var; ex(p->opr.op[0]); g_s=l_s; return 0; case PROCEDURE: printf("PROCEDURE not yet implement!\n"); //ex(p->opr.op[0]); //ex(p->opr.op[1]); pl0error=1; return 0; case ASSIGN: l_s=g_s; g_s=Lval; int lidx=ex(p->opr.op[0]); g_s=l_s; return vartable[lidx]=ex(p->opr.op[1]); case CALL: // just allow call to print if(strcmp(symlex[p->opr.op[0]->id.i].text, "print")) { printf("only CALL to print is allowed.\n"); pl0error=1; return 0; } int k; for(k=0; k<symlen; k++) { if(symlex[k].type==typeVAR) printf("\t%s=%d\n", symlex[k].text, vartable[symlex[k].idx]); } return 0;
时间: 2024-03-15 07:41:52 浏览: 220
这段代码看起来像是一个处理语法树节点的函数,其中包含了一些针对不同类型节点的操作。其中的操作包括对于运算符节点的递归调用,对于常量节点的处理以及对于变量节点的处理等等。同时,还包含了对于函数调用节点的特殊处理,只允许调用名为 "print" 的函数,并且在调用时会输出所有变量的值。不过,这段代码似乎是不完整的,因为对于类型为 PROCEDURE 的节点,只输出了一个错误信息,并没有进行具体的处理。
相关问题
解释这段代码case '.': ex(p->opr.op[0]); ex(p->opr.op[1]); ex(p->opr.op[2]); return ex(p->opr.op[3]);
这段代码是一种针对表达式的语法分析树的遍历方法,使用了递归的方式。其中,'.' 是操作符的一种,它的含义是将多个操作符链接起来。具体来说,这段代码会遍历表达式的第一个、第二个、第三个操作符,并在遍历完第三个操作符后,返回遍历第四个操作符的结果。这段代码的具体上下文和用途需要结合整个程序来看才能更好地理解。
解释下面的代码case VAR: vartable=malloc(symlen*sizeof(int)); varlen=0; l_s=g_s; g_s=Var; ex(p->opr.op[0]); g_s=l_s; return 0;
这段代码是在对一个类似于 C 语言中的 switch 语句中的一个 case 进行处理。其中 VAR 是一个常量值,表示该 case 对应的情况。这段代码的作用是为变量 VAR 分配一个内存空间,并将该变量的长度初始化为 0。然后将当前的全局符号表指针 g_s 赋值为 Var(表示当前正在处理的符号表是 VAR 变量对应的符号表)。接着,调用 ex 函数对该 case 的子节点进行处理。最后,将全局符号表指针 g_s 恢复为之前的值 l_s,并返回 0 表示处理完成。
阅读全文