この前、良い物を見つけたのでそれに関する記事です。
良い物って言うのは、yaccとlexです。コンパイラコンパイラと呼ばれていて、コンパイラを作るための支援ツールです。
簡単に言えば、コンパイラコンパイラは、電卓・設定ファイル(iniなど)の解析などのプログラム作成に使うと便利になるツールのことです。
コンパイラコンパイラは、それぞれ専用の言語を使って記述して、コンパイラコンパイラでコンパイルします。コンパイルをすると、C言語のソースが得られます。
便利ですね~。
次に、もう少し詳しく書きます。
yacc
こいつは、構文解析器を作るための物です。私は、「ヤック」と読んでいます。
構文解析は、簡単に言うと、、
「I like a computer.」という文があった。「これはSVOの構文である」と見る。正しい文だ。
とか、
「We flower have.」という文があった。「これは構文がおかしい」と見る。間違った文だ。
とかを判定する物です。
英語では、syntax(シンタックス)ってやつです。プログラムを組んでいる人なら、「syntax error」というエラーをよく見ると思います。それは、構文解析に失敗しているということです。
yaccでは、解析と同時に処理ができます。(たとえば、「数値 演算子 数値」と来たときに、数値を演算するなど。)
yaccを使えば、C言語で簡単に電卓を作れます。
yaccは、手に入りにくいので、普通は、互換性のあるbisonを使います。
lex
これは、字句解析器を作るための物です。私は、「レックス」って読んでます。
字句解析は簡単に言うと、、
「I like a computer.」という文があった。これを、「代名詞 動詞 冠詞 名詞 ピリオド」と解釈する。
とか、
「We flower have.」という文があった。これを、「代名詞 名詞 動詞 ピリオド」と解釈する。
のようなことをします。
lexでは、正規表現を使って字句を判定します。(上の例は、別途英語の辞書がいりますね。)
簡単な例だと、「1 + 1」と来たときに、「数値 演算子 数値」と読み取ります。
簡単なスクリプト言語などは、lexを使えば簡単に作れたりします。
lexも、yacc同様に入手しにくいので、flexを使います。(Adobe Flexじゃないですよ)
yacc/lex
このlexとyaccは、組み合わせて使うと、かなり強力に働きます。
基本的に、コンパイラというのは、字句解析→構文解析の順に処理します。
たとえば、電卓では、
「1+1」と入力。
字句解析器で「数値(1) 演算子(+) 数値(1)」と解析。
構文解析器で演算と解釈、「数値(2)」とする。
という感じで、処理します。
これを手書きで書くと非常に苦労します。実際に、FlowSimulatorのmathstr.dllに、このコードを手書きしていて、苦労しました。
これが簡単にできるというわけです。
どれだけ簡単になるのか?
それは次回に、yacc/lexを使ってみたいと思っています。
「コンパイラを作る」と言う本やネットの情報は、たくさんあるのですが、演算部分だけ詳しく、と言うものが、あまりなかったので、自分なりにメモっときたいと思っています。
ちなみに、作成目標は、簡単な電卓を予定しています。
コメントする