Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UniBinOpなどの機械的なマッピングが可能な非終端記号に対して必要なアノテーションの量を減らす #20

Open
junk0612 opened this issue Feb 17, 2016 · 2 comments

Comments

@junk0612
Copy link
Member

#19 参照。

expression => UniBinOp
    expression PLUS term
    | expression MINUS term
    | term

でビルドできるようにしたい。

@exKAZUu
Copy link
Member

exKAZUu commented Feb 29, 2016

      x.node "BinOp", doc: '二項式' do |d|
        d.mem "left", "Expr"
        d.mem "operator", String
        d.mem "right", "Expr"
      end

という定義から、以下のコードを生成する。なお、 Order アノテーションは以下のコードから拝借する。
http://stackoverflow.com/a/1099389/3145254
Order アノテーションを利用することで、フィールドやメソッドを特定の順序(定義した順序)で取得できるようになる。

public class UniBinOp extends UniExpr {
    @Order(value=1) public UniExpr left;
    @Order(value=2) public String operator;
    @Order(value=3) public UniExpr right;
}

さらに、以下の文法ファイルに対して、以下の様なコードを生成する。

  • 要素が1つしかなければそのまま返す(termだけが来た場合)
  • 1番目に処理する右辺のデータ expression をリフレクションで取得したメソッド列をソートした後の1番目(left)に代入
  • 2番目に処理する右辺のデータ PLUSMINUS をリフレクションで取得したメソッド列をソートした後の2番目(operator)に代入
  • 3番目に処理する右辺のデータ term をリフレクションで取得したメソッド列をソートした後の3番目(term)に代入
expression => UniBinOp
    expression PLUS term
    | expression MINUS term
    | term

@exKAZUu exKAZUu changed the title UniBinOpに対して必要なアノテーションの量を減らす UniBinOpなどの機械的なマッピングが可能な非終端記号に対して必要なアノテーションの量を減らす Feb 29, 2016
@exKAZUu
Copy link
Member

exKAZUu commented Feb 29, 2016

キャストできないケースは例外を吐いて終了するようにする。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants