文法規則部
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/02/16 05:20 UTC 版)
文法規則部には1個以上のYacc文法規則 変換結果: 構成要素1 構成要素2 … ; を記述しなければならない。 ここで,変換結果とは、規則が記述する非終端記号。構成要素とは、この規則がマッチするかを判定するために文法どおりの順に並べられる、0個以上の終端記号や非終端記号の列。例: qa: expr { printf(" Ans = %Lg", $1); prompt(); } /* 規則5 改行で計算,表示.*/ 同じ変換結果を生む複数の規則は次のように簡略に連続記述できる。 変換結果: 構成要素11 構成要素12 … | 構成要素21 構成要素22 … | 構成要素31 構成要素32 … ; 「;」は省略可能。 見て分かるとおり、構文規則は読み書きしやすいBNF記法になっている。 規則にマッチするたびに行ないたい動作、たとえば変換結果の意味値("$$")をその構成要素の意味値("$1", "$2", …)から計算すること、あるいは値を表示出力などは、C言語命令によるアクションとして「{ }」に囲って、マッチ直前に実行したい構成要素の直前に付して、あるいは規則適用時実行でよければその規則の最後の構成要素のあとに記述する。 例: 上例の「{ printf(" Ans = %Lg", $1); prompt(); }」はqaがexprにマッチと判定されたとき実行される。 規則は再帰的に定義できる。例で expr: NUM /* 規則6 「$$=$1;」は省略可 */ | expr '+' expr { $$ = $1 + $3; } /* 規則9 加算.*/ の規則6は、「NUMと名付けた数値トークンがきたら、それ1個単独でも式exprになる」と宣言している。 そして規則9は「expr '+' exprという並びもexprである」という意味で自分expを記述しているから、再帰的な定義である。すると、規則は繰り返して適用できるから、 NUMNUM '+' NUMNUM '+' NUM '+' NUM: など1個以上のNUMの加算式が、わずか2個の規則だけで表現できる。構文解析器実行時にこのうちのどれがやってきてもexprにマッチすると認識できることになる。 トークン値は実際にはASCIIコードと重ならない256以上の整数であるが、Yacc文法記述者はその値を知らなくてよく、NUM, EOLといった通常大文字で記述する記号で宣言と規則で統一的に記載すればよい。 トークンの意味値が伴う種類のトークンは、とりうる型は"%union"によって列挙して定義しておく。そして"%token"で"
※この「文法規則部」の解説は、「Yacc」の解説の一部です。
「文法規則部」を含む「Yacc」の記事については、「Yacc」の概要を参照ください。
- 文法規則部のページへのリンク