250422 --- 记一次成功的经验
成功
好不容易成功了
比我想象的难,麻烦。
中间有遇到 IF 语句的节点,我是真不知道咋写。
这时候,已经是下午5点多了,晚上8点约了客户说要远程,可我还没有做完,那个时候,我的心态是:
完蛋了,我什么都做不好,呜呜。我废了
但是,事实真的不是这样的。我是一个努力上进的人,而且有追求,也肯吃苦能干。
只是暂时遇到了困难,有点害怕困难,或者放大了困难。其实只要做起来,困难自然会消融。
我的方法论是:
1. 大问题拆解成小问题
2. Keep It Simple, Stupid
3. Use Debug Tools to find problem
4. 用gitee保存阶段性结果,一步一个脚印
5. 听李健的《贝加尔湖畔》(对,听这个歌,就莫名的平静,然后写代码很有效率)
gitee
https://gitee.com/wangqiyuejava63/sysy-compiler


有时候我会自我怀疑,也会自暴自弃
但是跟KIMI沟通,可以让我平静。大笑,可以让我开心。
我相信,我的行动可以影响心情,从而让我成为更好的人。
KIMI 对我的帮助

来自KIMI的神助攻
KIMI提供的几个类的定义,对我帮助极大。
ExprAST
BinaryExprAST
UnaryExprAST
FunctionCallExprAST
IdentExprAST
yacc.y 内增加Expr处理
Expr :
Expr AND Expr {
auto ast = new BinaryExprAST();
ast->left.reset(static_cast<ExprAST*>($1));
ast->right.reset(static_cast<ExprAST*>($3));
ast->op = "&&";
$$ = ast;
}
| Expr LEQ Expr {
auto ast = new BinaryExprAST();
ast->left.reset(static_cast<ExprAST*>($1));
ast->right.reset(static_cast<ExprAST*>($3));
ast->op = "<=";
$$ = ast;
}
| Expr GRE Expr {
auto ast = new BinaryExprAST();
ast->left.reset(static_cast<ExprAST*>($1));
ast->right.reset(static_cast<ExprAST*>($3));
ast->op = ">";
$$ = ast;
}
| Expr GEQ Expr {
auto ast = new BinaryExprAST();
ast->left.reset(static_cast<ExprAST*>($1));
ast->right.reset(static_cast<ExprAST*>($3));
ast->op = ">=";
$$ = ast;
}
| Expr LSS Expr {
auto ast = new BinaryExprAST();
ast->left.reset(static_cast<ExprAST*>($1));
ast->right.reset(static_cast<ExprAST*>($3));
ast->op = "<";
$$ = ast;
}
| Expr OR Expr {
auto ast = new BinaryExprAST();
ast->left.reset(static_cast<ExprAST*>($1));
ast->right.reset(static_cast<ExprAST*>($3));
ast->op = "||";
$$ = ast;
}
| NOT Expr {
auto ast = new UnaryExprAST();
ast->operand.reset(static_cast<ExprAST*>($2));
ast->op = "!";
$$ = ast;
}
| IDENT {
$$ = new IdentExprAST($1);
}
| IDENT LPARENT Expr RPARENT {
auto func_call = new FunctionCallExprAST($1);
func_call->args.emplace_back(static_cast<ExprAST*>($3));
$$ = func_call;
}
| LPARENT Expr RPARENT {
$$ = $2; // 去掉括号,直接使用内部表达式
}
;
Stmt内支持IF ELSE
// 用于IF语句的额外字段
std::unique_ptr<ExprAST> condition; // 条件表达式
std::unique_ptr<StmtAST> if_branch; // if分支
std::unique_ptr<StmtAST> else_branch; // else分支
...
if (kind == IF) {
if (condition) {
ss << " node" << node_id << " -> node" << condition->GetNodeID() << " [label=\"condition\"];\n";
ss << condition->DumpDOT();
}
if (if_branch) {
ss << " node" << node_id << " -> node" << if_branch->GetNodeID() << " [label=\"if_branch\"];\n";
ss << if_branch->DumpDOT();
}
if (else_branch) {
ss << " node" << node_id << " -> node" << else_branch->GetNodeID() << " [label=\"else_branch\"];\n";
ss << else_branch->DumpDOT();
}
}

笔记

局部

测试代码
int logicNumber = 0;
int testLAnd(int n)
{
logicNumber = n;
return 1;
}
int testLOr(int n)
{
logicNumber = n;
return 1;
}
int main()
{
int number;
number = getint();
logicNumber = 1;
if (! logicNumber && testLAnd(number)) { ;}
printf("%d\n", logicNumber);
logicNumber = 1;
if (testLAnd(number) && ! logicNumber) { ;}
printf("%d\n", logicNumber);
logicNumber = 0;
if (! logicNumber || testLOr(number)) { ;}
printf("%d\n", logicNumber);
logicNumber = 0;
if (testLOr(number) || ! logicNumber) { ;}
printf("%d\n", logicNumber);
if (number <= number > number) printf("true\n");
else printf("false\n");
if (number >= number < number) printf("true\n");
else printf("false\n");
if (number < number >= number) printf("true\n");
else printf("false\n");
if (number > number <= number) printf("true\n");
else printf("false\n");
return 0;
}
完整AST

给客户远程

被客户评价为
业务能力强


浙公网安备 33010602011771号