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*3^2 | 2*(3^2) | 「*」よりも優先順位が高い |
| 2^3^2 | 2^(3^2) | 右結合 |
| -3^2 | -(3^2) | 単項の「-」よりも優先順位が高い |
オンラインの提出場所は
レポート作成上の注意