首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ocamllex和ocamlyacc编写三地址代码?

如何使用ocamllex和ocamlyacc编写三地址代码?
EN

Stack Overflow用户
提问于 2012-05-02 05:25:19
回答 1查看 690关注 0票数 0

我想知道如何使用ocamllex和ocamlyacc编写一个三地址代码?我在谷歌上搜索了很多,但我没有找到任何使用ocamlyacc的东西。我可以使用解析器和词法分析器(当然都使用ocamlyacc和ocamllex),但现在我必须使用它们编写一个三地址代码生成器。例如,假设我有这个解析器(Calculator):

这三个地址码应该怎么写?

解析器:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2013-02-12 21:15:13

这里有一个解决方案:

首先,您必须在mly文件的头中添加以下内容:

代码语言:javascript
复制
%{  
  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)
%}

然后,您的规则将如下所示(我删除了第二个规则,并删除了一元减号以简化):

代码语言:javascript
复制
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 }
;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10404588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档