このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1294061094/493
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/FD1Z6ZPV 
#   
#  ・問題1 
#  非終端記号TおよびFの解析ルーチンに付けるコメントを(Eに関するコメントを参考に)完成しなさい。 
#  注意: printf(...)は、どの構文規則の適用されるか明示するためのものであるから、無視すること。 
#  ・問題2 
#  このサンプルを拡張して1桁の数字からなる式の値を計算する簡単な電卓プログラムに改造しなさい。 
#  ・問題3 
#  このサンプルを拡張して、代入文 <assign> ::= id '='<E> ';'を認識できるようにしなさい。 
#   
#  余計なプリント文を削除したソースプログラムと複雑な式を含む実行結果を提出すること。 
#   
#  
#  /********************************************************
#   * 再帰的下降型構文解析の例
#   * E: expressionを加減算の結果とする
#   * T: term  を乗除算の結果
#   * F: factor 項(被演算子)とする
#   * i: identifier 識別子(簡単のためアルファベット1文字)
#   *
#   * 構文規則(BNF)
#   * ::=  '\n'
#   * ::=  { {+|-} T}
#   * ::=  { {*|/}  }
#   * ::= i | (  )
#   *
#   応用練習問題
#    1)Pーマシン言語に翻訳する
#    2)一桁の数字からなる式の計算する電卓プログラムに改造する。
#    (2+8)/(7-4) * 5
#     15
#   ********************************************************/

構文解析(_文,_残りならび) :-
        sPLIT(_文,['(',')','+','-','*','/'],L1),
        空白要素を削除(L1,L),
        ''(L,_項,_残りならび).

''(_L,_項,R) :-
        ''(_L,_項,R1),
        '<\\n>'(R1,R).

''(_E,_項1 + _項2,R) :-
        ''(_E,_項1,R1),
        '<+>'(R1,R2),
        ''(R2,_項2,R).
''(_E,_項1 - _項2R) :-
        ''(_E,_項1,R1),
        '<->'(R1,R2),
        ''(R2,_項2,R).
''(_T,_項1 * _項2R) :-
        ''(_T,_項1,R1),
        '<*>'(R1,R2),
        ''(R2,_項2R).
''(_T,_項1 / _項2R) :-
        ''(_T,_項1,R1),
        ''(R1,R2),
        ''(R2,_項2,R).

''(_F,N,R) :-
        ''(_F,N,R).
''(_F,_項,R) :-
        '<(>'(_F|R1),
        ''(R1,_項,R2),
        '<)>'(R2,R).

'<\\n>'(['\n'|R],R).

'<+>'(['+'|R],R).

'<->'(['-'|R],R).

'<*>'(['*'|R],R).

''(['/'|R],R).

''([N|R],R) :-
        integer(N),!.

'<(>'(['('|R],R).

'<)>'([')'|R],R).