我想知道如何使用ocamllex和ocamlyacc编写一个三地址代码?我在谷歌上搜索了很多,但我没有找到任何使用ocamlyacc的东西。我可以使用解析器和词法分析器(当然都使用ocamlyacc和ocamllex),但现在我必须使用它们编写一个三地址代码生成器。例如,假设我有这个解析器(Calculator):
这三个地址码应该怎么写?
解析器:
input: /* empty */ { }
| input line { }
;
line: NEWLINE { }
| exp NEWLINE { }
;
exp: NUM { }
| exp PLUS exp { }
| exp MINUS exp { }
| exp MULTIPLY exp { }
| exp DIVIDE exp { }
| MINUS exp %prec NEG { }
| exp CARET exp { }
| LPAREN exp RPAREN { }
;示例:
输入:
5+(5*7)
三个地址码输出:
t1 = 5*7
t2 = 5+t1
发布于 2013-02-12 21:15:13
这里有一个解决方案:
首先,您必须在mly文件的头中添加以下内容:
%{
let count = ref 0
let tn () = "t" ^ (string_of_int !count)
let print_operation op x1 x2 =
incr count;
print_endline ((tn ()) ^ " = "^ x1 ^ op ^ x2)
%}然后,您的规则将如下所示(我删除了第二个规则,并删除了一元减号以简化):
input: EOF {}
| exp NEWLINE input { }
;
exp: NUM { $1 }
| exp PLUS exp { print_operation " + "$1 $3; tn () }
| exp MINUS exp { print_operation " - " $1 $3; tn () }
| exp MULTIPLY exp { print_operation " * " $1 $3; tn () }
| exp DIVIDE exp { print_operation " / " $1 $3; tn () }
| exp CARET exp { print_operation " ^ " $1 $3; tn () }
| LPAREN exp RPAREN { $2 }
;https://stackoverflow.com/questions/10404588
复制相似问题