You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于YACC&LEX的IF/ELSE计算器开发:条件分支执行难题

问题描述

我要开发一款支持IF/ELSE分支的计算器,已在YACC中添加对应TOKEN,其中expr用于表达式求值,stmt与stmtlist支持嵌套结构。但当前在检测条件表达式并根据结果执行对应代码块时遇到技术困难,相关YACC语法规则代码如下:

%%
//  US : liste de ... (commande, assignation, expression)
liste : 
    | liste error RC    { yyerrok; yyclearin; code (STOP); return 1;}
    | liste stmtList RC { printf("stmtList\n"); code((instr_t)printExprCode); code (STOP); return 3;}
    | liste cmd   RC    { code (STOP); return 6;}
    ;
//  US : Commande
cmd : 
      opCmd             { code ((instr_t)*($1->U.pFct));}
    | DBG sym           { dbgSymbol($2); }
    ;

// US : Expression algébrique
expr :  ENTIER          { code2((instr_t)intPush, (instr_t)$1);  }
    | REEL              { code2((instr_t)floPush, (instr_t)$1);}
    | IVAR              { code3((instr_t)varPush, (instr_t)$1, (instr_t)varEval);}
    | FVAR              { code3((instr_t)varPush, (instr_t)$1, (instr_t)varEval);}
    | UNDEF
    | PO expr PF        { printf("test&\n, $$=%f"); $$=$2; }
    | expr opAlg expr   { code ((instr_t)*($2->U.pFct)); }
    | SUB expr          { code((instr_t)negate); } %prec UNARY_MINUS
    | PREDEF PO expr PF { code2((instr_t)predef, (instr_t)$1); }
    | PO ENTIER LT ENTIER PF    { code3((instr_t)intPush, (instr_t)$1, (instr_t)intPush);}
    | expr opCOMP expr  { code ((instr_t)*($2->U.pFct)); }
    ;
assgn :
      IVAR AFF expr     { code3((instr_t)varPush, (instr_t)$1, (instr_t)varAssign); }
    | FVAR  AFF expr    { code3((instr_t)varPush, (instr_t)$1, (instr_t)varAssign); }
    | UNDEF AFF expr    { code3((instr_t)varPush, (instr_t)$1, (instr_t)varAssign); }
    ;

//  US : Statement
cond :  PO expr PF { printf("Condition");} ;

//cond :    PO ENTIER LT ENTIER PF { printf("ok"); if($1<$3){$$=1;}else{$$=0;}};

stmt : expr 
    | assgn
    | IF expr stmt {$$ = code(IF,)}
    ;   

//  US : Statement List
stmtList :              {data_t d; d.value = 0; push(d);}
    | stmt
    | stmtList DEL stmtList
    | AO stmtList AF
    ;

//  US : Statement List
block :
     AO stmtList AF         
    ;

// US : sym, nbr, var, opAlg, opCmc
sym : nbr | var | PREDEF | opAlg | opCmd | opCOMP
    ;
nbr : ENTIER | REEL
    ;
var : UNDEF |  IVAR | FVAR 
    ;
opAlg : ADD | SUB | MUL | DIV  
    ;
opCmd : PR_TS | PR_TS2 | DBG_TS | DBG_TS2
    ;
opCOMP : LT | GT | EQ | NE
    ;
%%

内容的提问来源于stack exchange,提问作者Gautier Essam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:35:18