yacc: 以后如何"save"代码执行?
yacc: how to "save" code for execution in future?
我对如何"save" yacc 解析的语法规则成为抽象语法树有误解。这是我的 yacc 文件的一部分:
expression:
expr2 { $$ = ; }
| expr2 EQ expr2 { $$ = ( == ); }
| expr2 NE expr2 { $$ = ( != ); }
| expr2 LT expr2 { $$ = ( < ); }
| expr2 LE expr2 { $$ = ( <= ); }
| expr2 GT expr2 { $$ = ( > ); }
| expr2 GE expr2 { $$ = ( >= ); }
;
expr2:
expr3 { $$ == ; }
| expr2 PLUS expr3 { $$ = + ; }
| expr2 MINUS expr3 { $$ = - ; }
;
expr3:
expr4 { $$ = ; }
| expr3 MULT expr4 { $$ = * ; }
| expr3 DIVIDE expr4 { $$ = / ; }
;
如您所见,所有操作都是即时执行的。我想做这样的事情:
expr2 PLUS expr3 { $$ = save_code_for_addition(, ); }
将此动作存储为抽象语法树的一个节点。
谁能解释一下这样一条预存指令的内部表示是什么,我以后到底如何通过 execute(Statement s) 执行它,什么是 Statement 数据类型?如何构建它?我真的很感激任何帮助,谢谢。
我找到了完全回答这个问题的手册:
http://web.eecs.utk.edu/~bvz/teaching/cs461Sp11/notes/parse_tree/
我对如何"save" yacc 解析的语法规则成为抽象语法树有误解。这是我的 yacc 文件的一部分:
expression:
expr2 { $$ = ; }
| expr2 EQ expr2 { $$ = ( == ); }
| expr2 NE expr2 { $$ = ( != ); }
| expr2 LT expr2 { $$ = ( < ); }
| expr2 LE expr2 { $$ = ( <= ); }
| expr2 GT expr2 { $$ = ( > ); }
| expr2 GE expr2 { $$ = ( >= ); }
;
expr2:
expr3 { $$ == ; }
| expr2 PLUS expr3 { $$ = + ; }
| expr2 MINUS expr3 { $$ = - ; }
;
expr3:
expr4 { $$ = ; }
| expr3 MULT expr4 { $$ = * ; }
| expr3 DIVIDE expr4 { $$ = / ; }
;
如您所见,所有操作都是即时执行的。我想做这样的事情:
expr2 PLUS expr3 { $$ = save_code_for_addition(, ); }
将此动作存储为抽象语法树的一个节点。
谁能解释一下这样一条预存指令的内部表示是什么,我以后到底如何通过 execute(Statement s) 执行它,什么是 Statement 数据类型?如何构建它?我真的很感激任何帮助,谢谢。
我找到了完全回答这个问题的手册: http://web.eecs.utk.edu/~bvz/teaching/cs461Sp11/notes/parse_tree/