Ragel ( IPA : /ˈɹeɪd͡ʒəl/ ) は、有限状態機械コンパイラおよびパーサージェネレータです。Ragel は当初、 C、C++、アセンブリのソースコードの出力をサポートしていましたが、[ 3 ]後にObjective-C、D、Go、Ruby、Javaなど、他のいくつかの言語をサポートするように拡張されました。[ 4 ]追加の言語サポートも開発中です。[ 5 ]正規表現[ 6 ]および/または状態チャートからテーブルまたは制御フロー駆動の状態機械を生成することをサポートしており、最長一致法を使用して字句解析器を構築することもできます。Ragel は特にテキスト解析と入力検証を対象としています。[ 7 ] Ragel のリポジトリは 2026 年 3 月 6 日にアーカイブされ、Ragel は colm-suite の一部になりました。
Ragelは、正規表現や状態遷移図からテーブル型または制御フロー型のステートマシンを生成する機能をサポートしており、最長一致法を用いて字句解析器を構築することも可能です。Ragelの特長の一つは、正規表現に組み込まれた演算子を用いて、ユーザー操作を任意のステートマシン遷移に関連付けることができる点です。また、RagelはGraphvizによる生成済みマシンの可視化もサポートしています。

上記のグラフは、 ASCII文字と制御コードを表すバイト列としてユーザー入力を受け取るステートマシンを表しています。48~57は正規表現[0~9](つまり任意の数字)に相当するため、数字で始まるシーケンスのみが認識されます。10(改行)が検出されると、プログラムは終了します。46は小数点('.')、43と45は正負の符号('+'、'-')、69/101は大文字/小文字の'e'(科学形式の数値を表す)です。したがって、以下を正しく認識します。
2 45 055 78.1 2e5 78.3e12 69.0e-3 3e+3
しかし、以下は該当しない:
.3 46. -5 3.e2 2e5.1
Ragel の入力は、正規言語を記述するという意味でのみ正規表現です。通常は簡潔な正規表現で記述されるのではなく、拡張バッカス・ナウア記法のように複数の部分に分割して記述されます。たとえば、正規表現構文で POSIX 文字クラスをサポートする代わりに、Ragel は組み込みの生成規則として実装します。通常のパーサー生成器と同様に、Ragel では生成規則の処理コードを構文で記述できます。[ 8 ]公式ウェブサイトから上記の例を生成するコードは次のとおりです。
action dgt { printf("DGT: %c\n", fc); } action dec { printf("DEC: .\n"); } action exp { printf("EXP: %c\n", fc); } action exp_sign { printf("SGN: %c\n", fc); } action number { /*NUMBER*/ }# 浮動小数点数のリテラル。number = ( [0-9] + $ dgt ( '.' @ dec [0-9] + $ dgt )? ( [eE] ( [+\-] $ exp_sign )? [0-9] + $ exp )? ) % number ;main := ( number '\n' )* ;