第 2 回レポートについて
次のようなプログラムを作成し、またそれに対するレポートを作成して下さい。
(締切 2月 22日 火曜日 18時)
問 1(再帰的下向き構文解析)
次の文法:
Start -> Expr EOL
Expr -> CON
| FunCall
FunCall -> FID '(' Expr ',' Expr ')'
-- 以下は終端記号: 字句解析部で処理
EOL -> '\n'
CON -> '0' | '1' | ... | '9' -- 一桁の数のみ
FID -> '+' | '-' | '*'
に対する再帰的下向き構文解析プログラムを参考にして、次の文法(記号の名前が英語になっただけで、
本質的には教科書・演習問題 5.2の文法と同じです):
Start -> Expr EOL
Expr -> VAR
| CON
| FunCall
| '(' Expr ')'
VAR -> VID Suffix
Suffix -> '[' Expr ']'
| ε(空列)
FunCall -> FID '(' Args ')'
Args -> Expr ArgRest
| ε(空列)
ArgRest -> ',' Expr ArgRest
| ε(空列)
-- 以下は終端記号: 字句解析部で処理
EOL -> '\n'
CON -> '0' | '1' | ... | '9' -- 一桁の数のみ
FID -> '+' | '-' | '*'
VID -> 'a' | 'b' | ... | 'z'
に対する再帰的下向き構文解析プログラムを作成せよ。
入力が文法的に正しければ "Correct!"(または「正しい!」)と表示し、
間違っていれば、適当なエラーメッセージを出力するようにしてください。
文法的に正しいかどうかを判断するのみで、
それ以上のこと(計算結果を求めるなど)はする必要はありません。
問 2 (Yacc (Bison))
Bisonについての例題を書き換えて、さらに累乗の演算子(^)にも対応したYaccによる構文解析・計算プログラムを作成せよ。
ただし 「^」は右結合で
「*」や「/」、さらに単項の「-」よりも、
優先順位が高いものとする。
例 | 解釈 | 備考 |
2*3^2 | 2*(3^2) |
「*」よりも優先順位が高い |
2^3^2 | 2^(3^2) |
右結合 |
-3^2 | -(3^2) |
単項の「-」よりも優先順位が高い |
ヒント:
- xの y乗を計算する C言語の関数は double
pow(double x, double y)、
なお、この関数を使うには #include <math.h>が必要である。
- (#include <math.h>を含めて)3行付け加えるだけで良いはず。
作成要領
レポートはワードで作成します。
作成したソースファイルとワードのファイルをオンラインで提出してください。
また同時に、ワードを A4用紙に印刷し、
ホッチキスで左上を綴じたものを学務係前のレポートボックスに提出してください。
オンラインの提出場所は
- \\Ruby\Report\kagawa\1999\SysProg\Report2\
の各自の学籍番号のフォルダです。必要なファイルは
- ワードのファイル(ファイル名 report2.doc)
- 問 1の Cのソースファイル(ファイル名 toi1.c)
- 問 2の bisonのソースファイル(ファイル名 toi2.y)
です。
(ファイル名は「半角」英数字のみを用いること。)
レポート作成上の注意
- 最初のページに表題
「システムプログラム 第 2 回レポート」・名前・学籍番号が入っていること。
- 各問に対して、
- プログラムソース(長い場合は自分で作成した部分のみ)
- プログラムが問の要求を満たしていることを示すような実行例 2 個以上
が入っていること。
- 最後に(授業とレポートの)感想が数行入っていること。
問題を数人で相談しながら解くのはもちろん構いませんが、
実行例とレポートは各自で作成してください。
実行例まで同一のレポートは不正レポートと見なします。
システムプログラム 99のホームページ
Koji Kagawa
(kagawa@eng.?????)