LexとYaccの違いとは?分かりやすく解説!

この記事には、アフィリエイト広告を利用しています。

スポンサーリンク


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が生成したトークンから解析木を生成するパーサーであることです。

タイトルとURLをコピーしました