| 開発者 | ヴァーン・パクソン |
|---|---|
| 初回リリース | 1987年頃[1] |
| 安定版リリース | 2.6.4 / 2017年5月6日 |
| リポジトリ |
|
| オペレーティング·システム | Unixライク |
| タイプ | 字句解析ジェネレータ |
| ライセンス | BSDライセンス |
| Webサイト | github.com/westes/flex |
Flex (高速字句解析器ジェネレータ) は、lexの代替となる無料のオープンソースソフトウェアです。[2]
これは、字句解析器(「スキャナ」または「レクサー」とも呼ばれる)を生成するコンピュータプログラムです。 [3] [4]これは、 BSD派生のオペレーティングシステム ( と は両方ともPOSIXの一部であるため)上のBerkeley Yaccパーサジェネレータ
と共に lex 実装として頻繁に使用されます。 [5] [6] [ 7]または*BSD ポート[8]および Linux ディストリビューションではGNU bison ( yaccのバージョン)と共に使用されます。 Bison とは異なり、 flex はGNU プロジェクトの一部ではなく、 GNU 一般公衆利用許諾書[9]の下でリリースされていませんが、Flex のマニュアルは Free Software Foundation によって作成および公開されています。[10] lexyacc
歴史
Flexは1987年頃にVern PaxsonによってC言語で書かれました[1] 。Van Jacobsonの多くのアイデアとインスピレーションの助けを借りて書かれました。オリジナル版はJef Poskanzerによるものです。高速テーブル表現はVan Jacobsonの設計の部分的な実装です。実装はKevin GongとVern Paxsonによって行われました[11] 。
字句解析器の例
これは、教育プログラミング言語PL/0用の Flex スキャナーの例です。
認識されるトークンは次のとおりです: ' +'、' -'、' *'、/' ='、' ' 、' '、' '、' (' 、' ' 、' '、' '、 ' '、 ' '、' '、' '、' '、' '、' '、' '
、' ' 、' '、' ' 、' '、数字: ;識別子:およびキーワード: 、、、、、、、、、、、、、、。),;.:=<<=<>>>=0-9 {0-9}a-zA-Z {a-zA-Z0-9}begincallconstdoendifoddprocedurethenvarwhile
% {
#include "y.tab.h" % }
数字[ 0-9 ]文字[ a - zA - Z ]
%%
"+" { return PLUS ; } "-" { return MINUS ; } "*" { return TIMES ; } "/" { return SLASH ; } "(" { return LPAREN ; } ")" { return RPAREN ; } ";" { return SEMICOLON ; } "," { return COMMA ; } "." { return PERIOD ; } ":=" { return BECOMES ; } "=" { return EQL ; } "<>" { return NEQ ; } "<" { return LSS ; } ">" { return GTR ; } "<=" { return LEQ ; } ">=" { return GEQ ; } "begin" { return BEGINSYM ; } "call" { return CALLSYM ; } "const" { return CONSTSYM ; } "do" { return DOSYM ; } "end" { return ENDSYM ; } "if" { return IFSYM ; } "odd" { return ODDSYM ; } "procedure" { return PROCSYM ; } "then" { return THENSYM ; } "var" { return VARSYM ; } "while" { return WHILESYM ; } { letter }({ letter } | {数字}) * { yylval . id = strdup ( yytext ); IDENTを返します; }
{ digit } + { yylval . num = atoi ( yytext ); return NUMBER ; } [ \ t \ n \ r ] /* 空白をスキップ */ . { printf ( "不明な文字 [%c] \n " , yytext [ 0 ]); return UNKNOWN ; } %%
int yywrap ( void ){戻り値1 ;}
内部
これらのプログラムは、決定性有限オートマトン(DFA)を使用して文字の解析とトークン化を実行します。DFA は、正規言語を受け入れる理論上のマシンです。これらのマシンは、チューリング マシンのコレクションのサブセットです。DFA は、読み取り専用の右移動チューリング マシンと同等です。構文は、正規表現の使用に基づいています。非決定性有限オートマトンも参照してください。
問題
時間計算量
Flex 字句解析器は通常、入力の長さに応じて時間の計算量が決まります。つまり、入力シンボルごとに定数の操作を実行します。この定数は非常に低く、GCC はDFA 一致ループに 12 個の命令を生成します。[引用が必要]この定数はトークンの長さ、正規表現の長さ、および DFA のサイズとは無関係であることに注意してください。
しかし、非常に長いトークンにマッチする可能性のあるスキャナで REJECT マクロを使用すると、Flex は非線形パフォーマンスのスキャナを生成する可能性があります。この機能はオプションです。この場合、プログラマーは、Flex がすでに入力にマッチした後に「戻って再試行する」ように明示的に指示しています。これにより、DFA は他の受け入れ状態を見つけるためにバックトラックします。REJECT 機能はデフォルトでは有効になっていません。パフォーマンスへの影響のため、Flex マニュアルではその使用は推奨されていません。[12]
再入性
デフォルトでは、Flex によって生成されたスキャナは再入可能ではありません。これは、生成されたスキャナを異なるスレッドから使用するプログラムに深刻な問題を引き起こす可能性があります。この問題を克服するために、Flex は再入性を実現するためにオプションを提供しています。これらのオプションの詳細な説明は、Flex マニュアルに記載されています。[13]
非Unix環境での使用
通常、生成されたスキャナにはUnix固有のunistd.hヘッダーファイルへの参照が含まれています。unistd.h をインクルードするコードの生成を避けるには、%option nounistd を使用する必要があります。もう 1 つの問題は、生成されたコードで見つかるisatty (Unix ライブラリ関数)の呼び出しです。 %option never-interactive は、 flex にisatty を使用しないコードを生成するように強制します。[14]
他の言語からflexを使用する
Flex はCおよびC++のコードのみを生成できます。他の言語から flex によって生成されたスキャナー コードを使用するには、SWIGなどの言語バインディングツールを使用できます。
ユニコードサポート
Flexは1バイト(8ビット)のバイナリ値のマッチングに制限されているため、Unicodeをサポートしていません。[15] RE/flexおよびその他の代替手段はUnicodeマッチングをサポートしています。
フレックス++
flex++はC++用の同様の字句スキャナで、flex パッケージの一部として含まれています。生成されたコードは、入力も依存しない限り、メモリ アロケータ ( mallocまたはユーザー提供の代替)を除いて、ランタイムや外部ライブラリに依存しません。これは、従来のオペレーティング システムやC ランタイム機能が利用できない 組み込みなどの状況で役立ちます。
flex++ で生成された C++ スキャナーには、FlexLexer.h2 つの C++ で生成されたクラスのインターフェースを定義するヘッダー ファイルが含まれています。
参照
参考文献
- ^ ab レヴァイン、ジョン(2009年8月)。flex & bison。オライリーメディア。p. 9。ISBN 978-0-596-15597-11987 年頃、
ローレンス バークレー研究所の Vern Paxson は ratfor (当時人気のあった拡張 Fortran) で書かれた lex のバージョンを C に翻訳し、これを「高速字句解析ジェネレータ」の略である flex と名付けました。
- ^ レヴィン、ジョン・R. ; メイソン、トニー; ブラウン、ダグ (1992). lex & yacc (第2版).オライリー. p. 279. ISBN 1-56592-000-7lex
の無料で利用できるバージョンはflexです。
- ^ レヴィン、ジョン・R. ; メイソン、トニー; ブラウン、ダグ (1992). lex & yacc (第2版).オライリー. pp. 1– 2. ISBN 1-56592-000-7。
- ^ レヴィン、ジョン(2009年8月)。flex & bison。オライリーメディア。p. 304。ISBN 978-0-596-15597-1。
- ^ OpenBSD (2015-12-11). "src/usr.bin/lex/". BSD 相互参照. 2015-12-26取得.
これは高速な字句解析ジェネレータである flex です。
- ^ "flex(1)"。*BSDマニュアルページ。
- ^ "yacc(1)". *BSDマニュアルページ。
- ^ 「bison-3.0.4 – GNU パーサージェネレーター」。OpenBSDポート。2015 年 11 月 15 日。2015 年 12 月 26 日閲覧。
- ^ flex は GNU か?、flex FAQ
- ^ 「Flex - スキャナジェネレータ - 目次 - GNU プロジェクト - フリーソフトウェア財団 (FSF)」。ftp.gnu.org 。2019 年 12 月 5 日閲覧。
- ^ 「Flex、バージョン 2.5 高速スキャナジェネレーター エディション 2.5、1995 年 3 月」 。2019年4 月 20 日閲覧。
- ^ 「パフォーマンス - Flex による字句解析、Flex 2.5.37 用」。Flex.sourceforge.net。2013年 2 月 25 日閲覧。
- ^ 「Reentrant - Flex による字句解析、Flex 2.5.37 用」。Flex.sourceforge.net。2013年 2 月 25 日閲覧。
- ^ 「コードレベルおよび API オプション - Flex による字句解析、Flex 2.5.37 用」。Flex.sourceforge.net。2013年 2 月 25 日閲覧。
- ^ Tomassetti, Gabriele (2020-03-04). 「(f)lex、yacc、bison を使用しない理由」Strumenta . 2022-10-26閲覧。
さらに読む
- レヴィン、ジョン(2009年8月)。flex & bison。オライリーメディア。ISBN 978-0-596-15597-1。
- ME Lesk と E. Schmidt、LEX - 語彙解析ジェネレーター
- Alfred Aho、Ravi Sethi、Jeffrey Ullman、「Compilers: Principles, Techniques and Tools」、Addison-Wesley (1986)。flex (決定論的有限オートマトン) で使用されるパターンマッチング手法について説明します。
外部リンク
- 公式サイト
- ANSI-C Lex仕様
- JFlex: Java 用高速スキャナ ジェネレーター
- Lex、Flex、YACC、Bison の簡単な説明 2005-05-07 にWayback Machineでアーカイブされました
