(Translated by https://www.hiragana.jp/)
Lex - Wikipedia コンテンツにスキップ

Lex

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』
Lex
作者さくしゃ エリック・シュミットマイク・レスク英語えいごばん
リポジトリ ウィキデータを編集
プログラミング
言語げんご
C言語げんご
対応たいおうOS Unix
サポートじょうきょう 開発かいはつ終了しゅうりょう
種別しゅべつ コマンド
テンプレートを表示ひょうじ

Lex(レック、レックス)は、1975ねんエリック・シュミットマイク・レスク英語えいごばんによって開発かいはつされた、レキシカルアナライザ(字句じく解析かいせきプログラム、字句じく解析かいせき)を生成せいせいするプログラムである。unixにおける標準ひょうじゅんのレキシカルアナライザとなっており、POSIX標準ひょうじゅんともなっている。コンパイラ作成さくせいのためにパーサジェネレータyaccとともに使用しようされることもおおい。

概要がいよう

[編集へんしゅう]

名称めいしょう

[編集へんしゅう]

Lexはレキシカルアナライザジェネレータである。すなわちレキシカルアナライザ(字句じく解析かいせきプログラム、字句じく解析かいせき)の生成せいせいツールであり、Lexの名称めいしょう英語えいごLexical analysisからきている。

用途ようと

[編集へんしゅう]

字句じく解析かいせきはテキストちゅう文字もじれつ変換へんかん、カウント、抽出ちゅうしゅつなどさまざまな目的もくてき使つかわれ、その応用おうよう領域りょういきは、コンパイラやコンバータの作成さくせい筆頭ひっとうに、自然しぜん言語げんご処理しょり簡単かんたん整形せいけいまで幅広はばひろい。

このうち、コンパイラにおけるレキシカルアナライザの位置いちづけを、以下いか説明せつめいする。 プログラム中間ちゅうかん言語げんごあるいは機械きかい変換へんかんするコンパイラは、一般いっぱんてきソース入力にゅうりょく構文こうぶん出力しゅつりょくする構文こうぶん解析かいせき(1)と、その構文こうぶん入力にゅうりょく中間ちゅうかん言語げんごコードまたは機械きかい出力しゅつりょくするコード生成せいせい(2)からなる。

コンパイラ
 ├構文こうぶん解析かいせき(1)
 │ ├字句じく解析かいせき(1.1) ←〔ソース〕
 │ │呼出よびだし↑↓
 │ │   ↑〔トークンれつ〕
 │ │   ↑↓
 │ └構文こうぶん解析かいせき(1.2)
 │     ↓
 │  〔構文こうぶん〕
 │     ↓
 └コード生成せいせい(2)   →〔中間なかま言語げんごコードまたは機械きかい

このうち(1)の前半ぜんはんは、ソース入力にゅうりょくトークン語彙ごいもとれつ出力しゅつりょくする字句じく解析かいせき(レキシカルアナライザ、トークナイザ、スキャナ)(1.1)である。 後半こうはんは、そのトークンれつ入力にゅうりょくし、構文こうぶん規則きそくにしたがって構文こうぶん解析かいせきをし、構文こうぶん出力しゅつりょくする構文こうぶん解析かいせき(パーサ、パーザ)(1.2)である。 (1.1)のレキシカルアナライザを生成せいせいするのが、レキシカルアナライザジェネレータである。

機能きのう概要がいよう

[編集へんしゅう]

構文こうぶん解析かいせき(1.2)に解析かいせき数字すうじ英字えいじ空白くうはくなどの1文字もじ単位たんいおこなわせると、複雜ふくざつになりすぎる。しかし、人間にんげん英文えいぶんから英単語えいたんご数字すうじなどの記号きごうれつを、区切くぎ文字もじ(たとえば空白くうはく、タブ、改行かいぎょう、コンマ、終止符しゅうしふ、カッコ)やそのれつ目印めじるし抽出ちゅうしゅつして、意味いみ判断はんだんしているのと、同様どうよう発想はっそうができる。すなわち、区切くぎ記号きごうれつでソースをっていくと、「print」のようなかたり、「1999」のような10進数しんすう、「"Hello, world"」といった文字もじリテラル、「++」といった演算えんざん、「}」や「;」など意味いみのある区切くぎ文字もじなど、各種かくしゅ文字もじれつせる。これをトークンという。ここまでの下位かい文法ぶんぽう処理しょり上記じょうき字句じく解析かいせき(1.1)におこなわせ、一方いっぽう構文こうぶん解析かいせき(1.2)はトークンから出発しゅっぱつしてぶん、ブロック、プログラムなどを認識にんしきする上位じょうい文法ぶんぽう処理しょり専念せんねんさせる。この分業ぶんぎょうにより、それぞれの定義ていぎ処理しょり簡潔かんけつにできる。

この字句じく解析かいせき(1.1)の合理ごうりてき開発かいはつ目的もくてきとし、機械きかい可読かどくにした規則きそく定義ていぎあたえれば字句じく解析かいせき自動じどう生成せいせいしてくれる便利べんりなツールがレキシカルアナライザジェネレータであり、LexやFlexなどがそれにぞくする。

規則きそく定義ていぎ〕
  ↓
レキシカルアナライザジェネレータ(Lex, Flexなど)
  ↓
〔字句じく解析かいせき(1.1)〕

同様どうように、構文こうぶん解析かいせき(1.2)の合理ごうりてき開発かいはつ目的もくてきとし、構文こうぶん規則きそく定義ていぎあたえれば構文こうぶん解析かいせき自動じどう生成せいせいしてくれる便利べんりなツールとして、Yacc(Yet Another Compiler Compiler)などのパーサジェネレータ(コンパイラコンパイラ)がある。

構文こうぶん解析かいせきジェネレータとの関係かんけい

[編集へんしゅう]

Yaccなどの構文こうぶん解析かいせき生成せいせいツールを利用りようするなら、Lexに字句じく文法ぶんぽう定義ていぎあたえて生成せいせいさせたC言語げんごソースである字句じく解析かいせきが(Yaccがトークンをユーザからるための)yylex関数かんすうふくんでいるので、CコンパイラでYacc出力しゅつりょく一緒いっしょにこれをリンクしてむ。これにより、ソーステキストの字句じく解析かいせき構文こうぶん解析かいせき両方りょうほうって、規則きそくのアクション(あるいはさらにそれにばれるユーザ作成さくせいのC言語げんご関数かんすう)にかれた計算けいさん結果けっかや、コンパイルの生成せいせい使つかわれる抽象ちゅうしょう構文こうぶん構造こうぞうたいデータ、あるいは各種かくしゅ表示ひょうじ出力しゅつりょくされる変換へんかんプログラムが完成かんせいする。

YaccとLexはよく文法ぶんぽう定義ていぎをもち、セットで使つかわれ、セットで解説かいせつされることがおおい。LexとYaccの機能きのうIEEE POSIX 1003.1-2008(かつては1003.2)で標準ひょうじゅんされている[1]

配布はいふ派生はせい改良かいりょう

[編集へんしゅう]

YaccはほとんどのUNIXシステムで、デフォルトのレキスカルアナライザジェネレータとして利用りよう可能かのうだった。 Lexはおおくのシステム、おおくのプログラミング言語げんご移植いしょくされている。たとえばJava言語げんごによる字句じく解析かいせき生成せいせいするLexけいツールに、JLex、それをなおしたJFlexがある。このJFlexとJava言語げんごよう構文こうぶん解析かいせきCUPみあわせてもちいることもおこなわれている[2]

Lexと同等どうとう機能きのうゆう性能せいのう改善かいぜんされているFlex(英語えいごばん)というものもある[3]が、開発かいはつしゃがLexの開発かいはつしゃとは別人べつじんen:Vern Paxsonであり、ライセンスもLexが Plan 9: MIT LicenseなのにたいしFlexのほうはBSDライセンスであり、つまりはまったべつのソフトウェアであり、しっかり区別くべつしたほうがよい。

Flexについてはべつ記事きじ Flex (字句じく解析かいせき生成せいせい)英語えいごばん をげ、そちらで説明せつめいすること。


Lex のファイル構造こうぞう

[編集へんしゅう]

Lexのファイル構造こうぞう意識いしきてきにyaccのそれにせて定義ていぎされている。 ファイルは3つの部分ぶぶん分割ぶんかつされており、それぞれ定義ていぎ領域りょういき規則きそく領域りょういきCコード領域りょういきである。かく領域りょういきはパーセント記号きごう2つ(%%)のみをふくんだくだり区切くぎられる。

定義ていぎ領域りょういき正規せいき表現ひょうげんもちいてマクロを定義ていぎするところであり、かつCのヘッダーファイル場所ばしょでもある。

規則きそく領域りょういきもっと重要じゅうよう領域りょういきでありCの命令めいれいとの関連かんれんけをおこなう。Lexの規則きそく一致いっちするパターンがあるとそれに関連付かんれんづけされたCコードを実行じっこうする。

Cコード領域りょういきには生成せいせいしたソースにそのままコピーされるCの命令めいれい関数かんすうふくまれている。 これらの命令めいれい規則きそく領域りょういきでの規則きそくによりばれたコードをふく場合ばあいもある。だい規模きぼなプログラムではここに分割ぶんかつしておきコンパイルときにリンクするほうが便利べんりである。

Lexの正規せいき表現ひょうげん

[編集へんしゅう]
  • 通常つうじょう正規せいき表現ひょうげん特殊とくしゅ文字もじにくわえ、「"」 「/」 「%」 「(」 「)」 「+」 「/」 「<」 「>」 「?」 「{」 「|」 「}」 も特殊とくしゅ文字もじである
  • 行頭ぎょうとうの「%」は、上述じょうじゅつのように領域りょういき区切くぎったり、Lex特有とくゆう指示しじをあたえるために使つか
  • 文字もじクラス、否定ひてい文字もじクラスの内側うちがわで「\」が特殊とくしゅ文字もじになる
  • 指定していしたときをのぞいて、否定ひてい文字もじクラスは、改行かいぎょうにも照合しょうごうする
  • "」で引用いんようできる。引用いんよう終了しゅうりょうも「"
  • パターン{最少さいしょう,最多さいた}」や「パターン{回数かいすう}」でパターンの繰返くりかえ回数かいすう指定していできる (Grep拡張かくちょう正規せいき表現ひょうげんおなじ)
  • +」は「{1,}」の、「?」は「{,1}」の、それぞれの省略形しょうりゃくけいである (Grepの拡張かくちょう正規せいき表現ひょうげんおなじ)
  • |」で択一たくいつできる。「(」と「)」で範囲はんいひろげて指定していできる (Grepの拡張かくちょう正規せいき表現ひょうげんおなじ)
  • \b」「\f」「\n」「\r」「\t」「\v」「\8進数しんすう」は、C文字もじ定数ていすう定義ていぎおな
  • 「<開始かいし条件じょうけん>正規せいき表現ひょうげん」で、指定してい名前なまえ開始かいし条件じょうけんにあるときの正規せいき表現ひょうげんだけに照合しょうごうできる。開始かいし条件じょうけんは、コンマで区切くぎって複数ふくすう指定していできる
  • 「r/s」は、正規せいき表現ひょうげん「s」の後続こうぞくする正規せいき表現ひょうげん「r」をあらわす。アクションで参照さんしょうできるのが「r」のみになるところが、重要じゅうようである
  • {名前なまえ}」で、定義ていぎ領域りょういき定義ていぎした名前なまえのマクロに展開てんかいされる


脚注きゃくちゅう出典しゅってん

[編集へんしゅう]
  1. ^ POSIX 1003.1-2008 - IEEE(有料ゆうりょう
  2. ^ Theory of Compilation -- JLex, CUP tools --(PDF) - by Haifa Univ. Bilal Saleh
  3. ^ Flex The Lexical Scanner Generator - G. T. Nicol(日本語にほんごやく

関連かんれん項目こうもく

[編集へんしゅう]

外部がいぶリンク

[編集へんしゅう]

とくlex と yacc の併用へいよう

とくFlex と Lex