LexとYaccの主な違いは、Lexがソースプログラムを意味のあるトークンに変換する字句解析器であるのに対し、YaccはLexが生成したトークンから構文木を生成するパーサーである点です。
一般に、コンパイラはソースコードを機械語に変換するソフトウェアです。
この変換を行うために、いくつかの段階を経る。
まず、字句解析の段階があります。
これは、ソースプログラムを1文字ずつ読み、意味のある字句(トークン)に変換するものです。
次に、そのフェーズの出力は構文解析に回される。
字句解析のトークンを受け取り、出力として構文木を生成する。
全体として、字句解析器は字句解析を行い、構文解析器は構文解析を行う。
Lexは字句解析器であるのに対し、Yaccは構文解析器です。
両者は一緒に動作する。
例えば、Lexは文字列の入力を受けてトークンを生成し、Yaccはそのトークン化された入力を利用する。
レックスとは
Lexは字句解析器を生成するコンピュータ・プログラムです。
Mike Lex と Eric Schmidt が Lex のオリジナル開発者です。
様々な UNIX システムで字句解析器生成の標準となっている。
LexはPOSIX標準の一部として規定されている。
一般に、LexはYacc構文解析器と一緒に使われる。
また、Lexは字句解析器を指定した入力ストリームを読み込む。
また、字句解析器を指定した入力ストリームを読み込み、その字句解析器をC言語で実装したソースコードを出力する。
Lexファイルは次の3つのセクションから構成される。
定義。
定義:C言語で書かれたマクロの定義とヘッダーファイルのインポート。
ルール C言語で書かれた正規表現のパターンが含まれています。
レキサは、入力中のテキストが与えられたパターンに一致すると識別すると、関連するCコードを実行します。
Cコード。
C言語によるステートメントと関数で構成されている。
さらに、オープンソース版のLexは、現在、ベル研究所からOpenSolarisとPlan 9の一部として配布されています。
オープンソース版のLexで最も普及しているのは、Fast Lexical Analyzerの頭文字をとってflexと呼ばれるものです。
Yaccとは
Yacc は Yet Another Compiler-Compiler の略です。
Stephan C. Johnson が開発し、UNIX システムで使用されています。
BSD と AT&T UNIX では標準的なユーティリティです。
また、GNUベースのLinuxディストリビューションには、Bisonという前方互換性のあるYaccの代替ツールが含まれている。
さらに、Yaccへの入力は、そのルールに添付されているCコードの文法です。
出力はC言語のshift-reduceパーサーで、ルールを認識した後、各ルールに関連付けられたCコードを実行する。
さらに、典型的な動作として、構文解析木を生成する。
LexとYaccの違い
定義
Lexは字句解析器として動作するコンピュータプログラムであり、YaccはUnixオペレーティングシステムで使用されるパーサーです。
開発者
Mike Lex と Eric Schmidt が Lex を開発し、Stephan C. Johnson が Yacc を開発しました。
機能性
Lex がソースプログラムを一文字ずつ読んで意味のあるトークンに変換するのに対し、Yacc はトークンを入力とし、解析木を出力として生成します。
結論
簡単に言うと、字句解析器とパーサはコンパイルプロセスの最初の2つのフェーズをサポートします。
言い換えれば、Lexは字句解析器であり、Yaccはパーサです。
したがって、LexとYaccの主な違いは、Lexがソースプログラムを意味のあるトークンに変換する字句解析器であるのに対し、YaccはLexが生成したトークンから解析木を生成するパーサーであることです。