yacc/lexを見つけて色々調べてみた

| コメント(0) | トラックバック(0) |

この前、良い物を見つけたのでそれに関する記事です。

良い物って言うのは、yacclexです。コンパイラコンパイラと呼ばれていて、コンパイラを作るための支援ツールです。

簡単に言えば、コンパイラコンパイラは、電卓・設定ファイル(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を使ってみたいと思っています。

「コンパイラを作る」と言う本やネットの情報は、たくさんあるのですが、演算部分だけ詳しく、と言うものが、あまりなかったので、自分なりにメモっときたいと思っています。

ちなみに、作成目標は、簡単な電卓を予定しています。

トラックバック(0)

トラックバックURL: https://www.letstryit.net/mt/mt-tb.cgi/173

コメントする

アーカイブ

カウンタ

Total
Today
Yesterday

IPv6 Ready

Powered by Movable Type 7.0

このブログ記事について

このページは、enjoypcが2010年5月25日 16:43に書いたブログ記事です。

ひとつ前のブログ記事は「ネットワーク再構築しました + 自鯖メモ」です。

次のブログ記事は「Serversman@VPSを使ってみた」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ