システムプログラム'99 演習問題(1)


準備

まず、Bison と Flexのインストールを読んで、 flexと bisonというプログラムを各自のノート PCにインストールしてください。

その 1

Flexについてを読んで、 その中の例題をコンパイルし実行してみてください。 そしてこれらの例題を参考にして、次の問題をやってください。

  1. (難易度 A)入力中の「hello」という文字列を「konnichiwa」に書き換える flexプログラムを作成せよ。
  2. (難易度 A)(偽 pascal作成プログラム) 入力中の「{」を「begin」に、 「}」を「end」に書き換える flexプログラムを作成せよ。
  3. (難易度 B)入力中の「<」と「>」に囲まれた部分を赤色で出力する flexプログラムを作成せよ。
    例: 下線部が赤色
    入力  出力
    <abc>def<ghi> -> <abc>def<ghi>
    <abc>def<ghi -> <abc>def<ghi
    <abc<def>ghi> -> <abc<def>ghi>
  4. (難易度 C)入力中の「"」と「"」に囲まれた部分(文字列リテラル)を赤色で出力する flexプログラムを作成せよ。ただし、 エスケープされたダブルクォート「\"」は文字列リテラルの終りとは見なさない。
    例: 下線部が赤色
    入力  出力
    printf("Hello\n"); -> printf("Hello\n");
    printf("\"Hello\"\n"); -> printf("\"Hello\"\n");
    printf("\"Hello\\"); -> printf("\"Hello\\");

その 2

例題: 演算子順位法による構文解析のプログラムをコンパイルして実行してみてください。 これは、1+2*3のような入力を受け取って、その答を計算するプログラムです。 そしてこの例題を参考にして、次の問題をやってください。
  1. (難易度 A)引き算(-)と割り算(/)にも対応した計算プログラムを作成せよ。
  2. (難易度 B)1. に加えて、さらに累乗の演算子(^)にも対応した計算プログラムを作成せよ。
    ただし ^は右結合で */よりも、 優先順位が高いものとする。
    (xの y乗を計算する C言語の関数は double pow(double x, double y)、 この関数を使うには #include <math.h>が必要である。)
  3. (難易度 B)入力された式の逆ポーランド記法を出力するプログラムを作成せよ。
    入力  出力
    1+2*3 -> 1 2 3 * +
    (1+2)*3 -> 1 2 + 3 *
    ヒント: 還元が起こるときに数や演算子を出力する。
  4. (難易度 C) 入力された式の Schemeでの表現を出力するプログラムを作成せよ。
    入力  出力
    1+2*3 -> (+ 1 (* 2 3))
    (1+2)*3 -> (* (+ 1 2) 3)
    ヒント: 一度、リストか木のようなデータ構造を作る必要がある。
  5. (難易度 C) 例題か 1.のプログラムに対して、 実際の電卓のようなグラフィカルユーザインターフェースを作成せよ。 さらにスタックの部分も画面に表示できるようにせよ。
参考: 演算子順位法による構文解析のコア部分
   while(1) {
      a = スタックの最上段の終端記号;
      b = 入力の最初の記号;
      if (a<b または a=b) { /* シフト */
         bをスタックに積む;
         入力から bを取り除く;
      } else if (a>b) { /* 還元 */
         aをスタックから取り去る;
         さらに aと = の関係にある記号も、
           スタックから取り去る;
      } else {
        構文エラーをレポート;
      } 
   }

システムプログラム 99のホームページ
Koji Kagawa (kagawa@eng.?????)