【发布时间】:2023-05-31 05:23:01
【问题描述】:
我有一个符号表,其中包含一个变量/符号的名称、它的数据和它的数据类型(存储为一个字符)。我想要它,以便符号被视为 iexpr(如果它是整数)或 reexpr(如果它是实数)。这些是我现在拥有的规则:
iexpr: INT_TOKEN
| iexpr PLUS iexpr { $$ = $1 + $3; }
| iexpr MINUS iexpr { $$ = $1 - $3; }
| iexpr DIVIDE iexpr {$$ = $1/$3;}
| iexpr MOD iexpr{$$ = $1 % $3;}
| LPARENT iexpr RPARENT{$$=$2;}
| SYMBOL { symrec *s;
s = getsym($1);
if(s!=0){
if(s->type == 'i'){
$$ = atoi(s->data);
}
}
}
;
rexpr: REAL_TOKEN
| rexpr PLUS rexpr { $$ = $1 + $3; }
| rexpr MINUS rexpr { $$ = $1 - $3; }
| iexpr PLUS rexpr { $$ = (double) $1 + $3; }
| iexpr MINUS rexpr { $$ = (double) $1 - $3; }
| rexpr PLUS iexpr { $$ = $1 + (double) $3; }
| rexpr MINUS iexpr { $$ = $1 - (double) $3; }
| rexpr DIVIDE rexpr {$$ = $1/$3;}
| rexpr MULTIPLY rexpr{$$ = $1 * $3;}
| rexpr DIVIDE iexpr {$$ = $1 / (double) $3;}
| rexpr MULTIPLY iexpr {$$= $1 * (double) $3;}
| iexpr DIVIDE rexpr {$$ = (double) $1 / $3;}
| iexpr MULTIPLY rexpr {$$ = (double) $1 * $3;}
| rexpr MOD rexpr {$$ = (int)$1 % (int)$3;}
| rexpr MOD iexpr {$$ = (int)$1 % $3;}
| iexpr MOD rexpr {$$ = $1 % (int)$3;}
| LPARENT rexpr RPARENT{$$ =$2;}
| SYMBOL { symrec *s;
s = getsym($1);
if(s!=0){
if(s->type == 'r'){
$$ = atof(s->data);
}
}
}
;
然而,rexpr 中的规则从未被使用,因为它只将其视为 iexpr。我怎样才能使它根据类型描述符被视为该类型而不仅仅是整数?
编辑:所以我尝试更改我的 lex 文件,以便它为每种类型返回不同的令牌。为此,我需要包含我的符号表头文件,以便我可以检查该名称并根据其类型返回不同的符号。这是代码:
[a-zA-Z]+ { yylval.string = strdup(yytext);
symrec *s;
s = getsym(yylval.string);
if(s!=0){
if(s->type == 'r'){
return RSYMBOL;
}else if(s->type == 'i'){
return ISYMBOL;
}
}else{
return SYMBOL;
}
}
但是现在我有一个错误,说我有多个头函数定义,因为我将它包含在两个文件中。
【问题讨论】:
标签: bison flex-lexer