Я пишу демоверсию генерации кода llvm для определенного языка, который включает в себя инструкцию if. Вот правила и действия, соответствующие моему вопросу:Анализ синтаксического выражения в yacc
IfStatement : IF CondExpression THEN Statement {if_Stmt(string($2),string($4));} %prec LOWER_THAN_ELSE ;
| IF CondExpression THEN Statement ELSE Statement {if_else_Stmt(string($2),string($4),string($6));}
;
CondExpression : Expression Relop Expression { $$ = operation($2,string($1),string($3));printf("Relop value : %s \n",$2);}
| Expression {$$ = $1;}
;
Relop : EE {$$ = (char *)(string("icmp eq ").c_str());printf("%s\n",$$);}
| NE {$$ = (char *)(string("icmp ne ").c_str());}
| LT {$$ = (char *)(string("icmp slt ").c_str());}
| GT {$$ = (char *)(string("icmp sgt ").c_str());}
| LTE {$$ = (char *)(string("icmp sle ").c_str());}
| GTE {$$ = (char *)(string("icmp sge ").c_str());}
;
Правило CondExpression следует разобрать условное выражение. Я использую функцию печати для печати значения токена Relop, который имеет тип < char *>. Relop должен иметь значение условных токенов внутри строковой функции, как показано выше в коде. Тем не менее, результат функции печати, 0
Relop value : 0
и результат второго печати внутри Relop является правильным,
Relop value : icmp eq
почему значение Relop в CondExpression является 0, и как это сделать возьмите правильное значение, возвращенное из правила Relop.
Каков твой семантический тип? – rici
char * для CondExpression и Relop –