:
Conflicts
:
曖昧な文法のLRパース
パーサ生成系を使う
LR(1) または LALR(1) パース表を構成する処理は,自動化するために は十分にシンプルである.
実際的な文法に対して LR パースを,パーサ生成ツールを用いること なしに,手で処理することは,非常にあきあきする(tedious)ほどである.
ML-yacc は 伝統的な Yacc(Yet another compiler-compiler) パーサ生 成系をモデル化した,一つのツールである.
ML-yacc の仕様は,
%%
により,3 つのセクションに分けるこ とができる.
ユーザ宣言
%%
パーサ宣言
%%
文法規則
ユーザ宣言(user declarations) は, 通常の ML の宣言である(後にある意味アクションのため).
パーサ宣言(parser declarations) は, 終端記号,非終端記号のリスト(宣言) などである.
文法規則(grammar rules) は,以下のような production である.
exp: exp PLUS exp { 意味アクション }
exp
は,右側の
exp+exp
から生成される非終端記号である.
PLUS
は終端記号(トークン) である.意味アクションは,通常の ML で 記述され,この規則を使い(パーサによる)還元されたときに,実行される.
Grammar 3.30 のための,ML-Yacc による出力を図3.32 に示す(実際の 入力は,Grammar 3.31).
ML-Yacc は,文法仕様のための完全な説明を与えている.この文法では, 終端記号は
ID
,
WHILE
などである.非終端記号は
prog
,
stm
,
stmlist
などである.
ML-Yacc がこの(ような)文法を処理するときは,いつもパース表の verbose な記述を出力する.
end-of-parse トークンは
EOF
で示す.文法の startシンボル は,
prog
で示す.
Conflicts
優先順位命令(Precedence Directives)
文法(syntax) と,意味(semantics)
平成12年8月22日