gpt4 book ai didi

c++ - 如何构建递归下降解析器

转载 作者:行者123 更新时间:2023-11-30 01:56:16 29 4
gpt4 key购买 nike

我一直在为一个简单的计算器开发递归下降解析器。当声明某物时,它要么被声明为 int 要么被声明为 float。目前我将字符串保存到两个不同的 vector 中,一个用于 int,一个用于 float。在这一点上,我不关心关联的数字是什么,我只关心字符串在使用之前是否已声明。

我的问题是,如果在 float + int 等操作中使用了 int 和 float,我必须能够输出警告消息。

因此,如果 expression 是 term+expression 或 term-expression 或 term。在递归下降中,我怎么可能检查是否在带有 float 的操作中使用了 int。抱歉,如果解释不清楚。我觉得解释起来有点困难。如果有必要,我已经添加了一些代码,我只是不想用代码淹没这个问题。

编辑:仍然缺少一堆代码,我想只捕获重要的部分,但如果需要我可以上传整个东西。我看到有些人不明白主要问题是什么。其中一项要求是“当整数和浮点值混合在 +、-、* 和/中时,整数将转换为 float 。打印一条消息,指示行号并需要转换。”目前程序从文件中读取。如果你说“int x;”该程序当前会将 x 保存在 int vector 中,然后当您说 x=5; 之类的内容时它将确认 x 已被声明并且分配将通过。我的问题是如果你说 int x; float y;诠释z; x=5; y=7.5; z=x+y;我将如何检查它,因为目前我的程序只保存变量的类型而不是值。本质上,我想知道是否有可能做一些事情,比如扫描完成的解析,就好像它是一个字符串,或者其他一些方法来找出正在使用 int 和 float 的操作。

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);
}

最佳答案

我认为您需要多解释一下代码的结构。

在像您所说的那样的解释器中,通常会发生三件事:

  1. 词法分析器/扫描器正在生成 token 流
  2. 解析器正在获取 token 并构建语义对象
  3. 解释器正在使用语义对象树并执行它们

第 1 阶段不需要关心您添加的是 int 和 float。第 2 阶段可以在您的语义对象/结构中填充一个警告字段,当解释器看到填充时将打印该警告字段,或者解释器可以自己识别此警告条件。

为了向您提供更多详细信息或使用更具体的术语,我们需要了解您如何表示操作。

关于c++ - 如何构建递归下降解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19936878/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com