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

给客户远程

被客户评价为

业务能力强

posted @ 2025-04-22 23:47  lucky_doog  阅读(9)  评论(0)    收藏  举报