これまで
シェルもどき「oreshell」を自作している。
現状のoreshellはリダイレクションを行うとエラーになるのでリダイレクションできるように修正する。
前回はファイルディスクリプタ操作部分の実装を検討した。
今回はリダイレクション対応に合わせた字句解析器の修正と「構文解析器」の実装、動作確認。
今回までに行った字句解析についての説明はコチラ。
リダイレクションに対応するために、リダイレクション文字、ファイルディスクリプタ番号、リダイレクション先ファイル名の切り出してトークンの羅列を作成できるように字句解析器を修正する。
修正内容の細かい説明は省略。
注意する点は以下の通り。
一般的なインタプリタは、その入力に対して
1.字句解析
2.構文解析
3.評価
を順に処理を行う。
それぞれの処理を「字句解析器」「構文解析器」「評価器」が行う。
それぞれの出力(結果)が次の処理の入力となる。
関係を以下に図で示す。
構文解析では、「字句解析の結果が定義した構文のとおりであるかどうか」を調べ、構文通りであれば「抽象構文木」と呼ばれるデータ構造を作成する。評価では、抽象構文木が表すデータ構造に基づいて実際の処理の実行を行う。
oreshellの字句解析結果の例はコチラ。
oreshellのリダイレクションの構文はコチラ。
■構文解析とは
プログラミング言語やマークアップ言語などのコンピュータ言語で書かれた文を構成要素に分解し、要素間の関係を元に特定のデータ構造に変換する操作を構文解析という。
e-words
■抽象構文木とは
抽象構文木(英: abstract syntax tree、AST)は、通常の構文木(具象構文木あるいは解析木とも言う)から、言語の意味に関係ない情報を取り除き、意味に関係ある情報のみを取り出した(抽象した)木構造の木である。
wikipedia
■構文木とは
構文木(こうぶんぎ)とは、構文解析の経過や結果(またはそれら両方)を木構造で表したもの。
wikipedia
今回のoreshellリダイレクション対応では以下の図ような抽象構文木が必要になる。
goで書くと以下の通り。
リダイレクション対応するために上記のような抽象構文木を作成する構文解析器を実装する。
実装の細かい説明は省略。
今回パーサを作ってみて「こうしておいたほうが結局楽だな」と思った点は以下の通り。
字句解析、構文解析を呼び出している様子
実装が完了したので動作確認する。