数式を解くプログラム その4 - 構文解析1
id:yone-ken:20090219:p1 の続きです。例によって一般的な説明はwikipedia:構文解析を参照して頂くとして、「数式を解くプログラム」の場合の構文解析を具体的に説明します。そのために以前に定義した文法の抜粋を載せます。
::= ('+' )* | ('-' )* ::= ('*' )* | ('/' )* ::= '(' ')' | '+' | '-' |
上記の定義で
コンピュータに行わせる処理はその前に人間が机上で同じことができなければ実装できません。まずは机上で、さまざまな式を文法に照らし合わせてみましょう。
例1
1+2
これを解析すると以下の図1のようになります。この図では、式と構文定義を上から順に照らし合わせて、非終端記号を右辺に展開していきます。
図1 式「1+2」の解析
→ // は ではじまる。 → // は ではじまる。 → // で、今のトークンはNumber(1)のため、 である。 // 「1」は構文定義に合致した。 → + // 次のトークンはOpAddのため、その次は ではなく である。 // 「+」は構文定義に合致した。 → + // は ではじまる → + // で、今のトークンはNumber(2)のため、 である。 // 「2」は構文定義に合致した。 // 次のトークンはEofのため、構文解析は終了。
式「1+2」の字句解析では、Number、OpAdd、Number、Eofのトークンの並びが得られます。構文解析の手順は次の通りです。
- 式は
です。 は で始まります。 は で始まります。 は(、+、-のどれかで始まるか、数値です。式の最初のトークンはNumber(1)のため、文法定義 の中の が該当します。ここで の解析は終了です。 - 1つ戻って、
の解析を続けます。 の解析のうち、始めの の解析は終わっているので、次のトークンとして想定されるのは、*、/のどちらかか、そうでなければ は終了です。Numberの次のトークンはOpAddで*、/のどちらでもないので、ここで の解析は終了です。 - 1つ戻って、
の解析を続けます。 の解析のうち、始めの の解析は終わっているので、次のトークンは+、-のどちらか、そうでなければ の解析は終了です。次のトークンはOpAddのため、さらにその次のトークンは が期待されます。 は では始まります。 は(、+、-のどれかで始まるか、数値です。次のトークンはNumber(2)のため、文法定義 の中の が該当します。ここで の解析は終了です。 - 次のトークンはEofのため、これで構文解析は完了です。
式が複雑になっても、考え方は同じです。もう1例挙げます。次の例2について、自分でコンピュータになったつもりで解析してみてください。
例2
1+(2-3)*4/5
図2 式「1+(2-3)*4/5」の解析
→ → → → + → + → + ( → + ( → + ( → + ( → + ( - → + ( - → + ( - → + ( - ) → + ( - ) * → + ( - ) * → + ( - ) * / → + ( - ) * /
今回はここまでです。次回も引き続き構文解析についての説明です