我一直在为一个简单的计算器开发递归下降解析器。当某个东西被声明时,它要么被声明为 int 要么被声明为 float。目前,我将字符串保存到两个不同的向量中,一个用于 int,一个用于 float。在这一点上,我不在乎关联的数字是什么,我只关心在使用之前声明字符串。
我的问题是,如果在诸如 float + int 的操作中使用 int 和 float,我必须能够输出警告消息。
因此,如果表达式是术语+表达式或术语-表达式或术语。在递归下降中,我怎么可能检查一个 int 是否被用于带有浮点数的操作中。对不起,如果解释不清楚。我觉得解释起来有点困难。如果有必要,我已经添加了一些代码,我只是不想用代码淹没这个问题。
编辑:仍然缺少一堆代码,我想抓住重要的部分,但如果需要,我可以上传整个东西。我看到有些人不明白主要问题是什么。要求之一是“当整数和浮点值混合在 +、-、* 和 / 中时,整数将转换为浮点数。打印一条消息,指示行号并且需要进行转换。” 目前程序从文件中读取。如果你说“int x;” 程序当前会将 x 保存在 int 向量中,然后当您说诸如 x=5 之类的内容时;它将承认 x 已被声明并且分配将通过。我的问题是如果你说 int x; 浮动y; 诠释z; x=5;y=7.5;z=x+y;我如何能够检查这一点,因为目前我的程序只保存变量的类型而不是值。
lex 扫描器是用 flex 创建的
class Token {
Tokentype type;
string value;
int linenum;
public:
Token(Tokentype t, string v="") {
type = t;
value = v;
}
Tokentype getType() { return type; }
string getValue() { return value; }
int getLinenum() { return linenum; }
};
vector<string> int_list;
vector<string> float_list;
class PTree {
PTreeNodetype type;
PTree *left;
PTree *right;
public:
PTree(PTreeNodetype t, PTree *l=0, PTree *r=0) {
type = t;
left = l;
right = r;
}
PTreeNodetype getType(){ return type;}
};
// expr ::= term PLUS expr | term MINUS expr | term
PTree *
Expr() {
PTree *term = Term();
Token *t;
if (!term)
return 0;
t = getToken();
if (t == NULL){
delete t;
return 0;
}
if(t->getType() != T_SC)
{
if (t->getType() == T_RPAREN){
pushbacktoken(t);
return new PTree(EXPR, term);
}
if (t->getType() != T_PLUS && t->getType() != T_MINUS)
{
cout << t->getLinenum() << ":" << "Error: expected + or -" << endl;
pushbacktoken(t);
delete t;
return 0;
}
delete t;
PTree *expr = Expr();
if (!expr)
return 0;
return new PTree(EXPR, term, expr);
}
pushbacktoken(t);
return new PTree(EXPR, term);
}