0

ocamllex と ocamllyacc を使用して 3 つのアドレス コードを記述する方法を考えていました。私はこれについてたくさんグーグルで調べましたが、ocamlyacc を使用して何も見つけることができませんでした。パーサーとレクサーが動作しています (もちろん、両方とも ocamlyacc と ocamllex を使用しています) が、これらを使用して 3 つのアドレス コード ジェネレーターを作成する必要があります。たとえば、このパーサー (電卓) があるとします。

3つの住所コードはどのように書けばよいですか?

パーサー:

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)

3 つのアドレス コード出力:

t1 = 5*7

t2 = 5+t1

4

1 に答える 1

2

ここに解決策があります:

最初にこれを 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)
%}

次に、ルールは次のようになります (単純化するために 2 番目のルールと単項マイナスを削除しました)。

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 }
;
于 2013-02-12T13:15:13.490 に答える