我一直在为一个简单的计算器开发递归下降解析器。当某个东西被声明时,它要么被声明为 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);
  }