体験して学ぶシリーズ その3 Antlrを体験しよう!

                                               2012年1月17日(火)
                                               東京工科大学
                                               コンピュータサイエンス学部
                                               思考と言語研究室
                                               亀田弘之

  1. まずは使ってみよう!
    ANTLRWorks 1.4.3 を起動してから以下の作業をしてみよう。
    1. 下記のANTLRプログラムコードをANTLRWorksの画面にコピーしよう。
      grammar Expr;
      
      @header {
      package test;
      import java.util.HashMap;
      }
      
      @lexer::header {package test;}
      
      @members {
      /** Map variable name to Integer object holding value */
      HashMap memory = new HashMap();
      }
      
      prog:   stat+ ;
                      
      stat:   expr NEWLINE {System.out.println($expr.value);}
          |   ID '=' expr NEWLINE
              {memory.put($ID.text, new Integer($expr.value));}
          |   NEWLINE
          ;
      
      expr returns [int value]
          :   e=multExpr {$value = $e.value;}
              (   '+' e=multExpr {$value += $e.value;}
              |   '-' e=multExpr {$value -= $e.value;}
              )*
          ;
      
      multExpr returns [int value]
          :   e=atom {$value = $e.value;} ('*' e=atom {$value *= $e.value;})*
          ; 
      
      atom returns [int value]
          :   INT {$value = Integer.parseInt($INT.text);}
          |   ID
              {
              Integer v = (Integer)memory.get($ID.text);
              if ( v!=null ) $value = v.intValue();
              else System.err.println("undefined variable "+$ID.text);
              }
          |   '(' e=expr ')' {$value = $e.value;}
          ;
      
      ID  :   ('a'..'z'|'A'..'Z')+ ;
      INT :   '0'..'9'+ ;
      NEWLINE:'\r'? '\n' ;
      WS  :   (' '|'\t')+ {skip();} ;

    2. 構文図を描かせてみよう!
      下記のようにANTLRWorksの右画面に上述のコードが複写されているとき、下記画面の左の“prog”部分をクリックする。すると構文図が表示される。


    3. 実行させてみよう!
      プログラムの構造がわかったので、いよいよ実行してみよう。
      1. まずANTLRWorksの画面下部分の“Interpreter”タブをクリックする。
      2. 画面左下の小さな画面領域(“prog”という字の下の領域)に数式を記入する。例えば、 2*X+3-y と入れてみよう。
      3. その後、“prog”という文字の左にある黒い三角マークのボタンをクリックする。警告(warning)が出るかもしれないが、ここではまずは無視しよう。
      4. すると、画面右下に入力した計算式を構文解析した結果が構文木として表示される。

    4. デバッガーを起動し、動作を追跡してみよう!
      (ANTLR v3 のページ ( http://www.antlr.org/works/help/tutorial/calculator.html ) を参照のこと)
    5. 練習課題にチャレンジしてみよう!
      • 課題1 論理式を認識し、論理計算をするプログラムを作る。
        1. 論理式を以下のように定義する。
          • 字母: 
            • 命題変数: P, Q, R, ...
            • 論理結合子: ¬,∧,∨,→
            • 記号類: ),(
          • 構文
            1. 命題変数は論理式である。
            2. αとβを論理式とするとき、以下のものはどれも論理式である。
              • (¬α)
              • (α∧β)
              • (α∨β)
              • (α→β)
            3. 以上のものだけが論理式である。

             例:
            1. P,Q,R,...はいずれも命題変数であるから、P,Q,R,...はどれも論理式である。
            2. PとQは論理式であるから,(P∧Q)や¬Pは論理式である。
            3. (P∧Q)とPは論理式であるから、((P∧Q)∨P)や((¬(P∧Q))∨P)は論理式である。
        2. 簡単な論理式を5つ程作成してみよう。なお、使用する命題変数はP,Q,R,Sの4つとしてよい。
        3. 論理式の文法を作ってみなさい。
          • 論理式 = 命題変数 | ¬論理式 | (論理式∧論理式) | (論理式∨論理式) | (論理式→論理式)
          • 命題変数 = P | Q | R | S
        4. ANTLRWorksに入力してみよう。
        5. 文法チェック ( Grammar Check ) をかけてみよう。
        6. 構文図を表示させてみよう。
        7. 実行してみよう。
        8. ANTLRWorksの使い方に慣れよう。
      • 課題2 プログラミング言語の処理系を作ってみよう!
        1. インターネットや図書館で文献を利用して、プログラミング言語の構文図を探してみよう。
        2. ANTLRに実装して見よう。
      • 課題3 (未定)
    6. 自分で課題を考えてそれを解決してみよう!
  2. そして...経験を積みスキルを上げよう!
  3. 最後に
    ツールはあくまでもツールでしかありません。ツールの使い方を覚えることやさらい良いツールを作ることも大切ですが、画期的なアプリケーションソフトウェアを作ることも大切です。バランスを考えて勉強・開発・研究をしてください。

 参考図書

  1. Terence Parr, The Definitive ANTLR Reference: Building Domain-Specific Languages(2007).