これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド ragel です。
プログラム:
NAME
ragel - 通常の言語を実行可能なステートマシンにコンパイルします
SYNOPSIS
レーゲル [オプション] file
DESCRIPTION
Ragel は、通常の言語から実行可能な有限状態マシンをコンパイルします。 ラジェル缶
C、C++、Objective-C、D、Go、または Java コードを生成します。 Ragel ステート マシンは次のことを行うだけでなく、
正規表現マシンと同様にバイト シーケンスを認識しますが、次の場所でコードを実行することもできます。
通常言語の認識における任意の点。 ユーザーコードは次を使用して埋め込まれます
通常言語の構文を壊さないインライン演算子。
コア言語は、union などの標準の正規表現演算子で構成されます。
連結およびクリーンスター。アクション埋め込み演算子を伴います。 ラジェルも
作成、構築する非決定性を制御できる演算子を提供します。
最長一致パラダイムを使用したスキャナー、およびステートチャートを使用したステート マシンの構築
モデル。 ステートマシンの実行に内部から影響を与えることも可能です。
マシンの他の部分にジャンプまたは呼び出して再処理することによる埋め込みアクション
入力。
Ragel は、ホスト言語に非常に柔軟なインターフェイスを提供し、
生成されたコードがどのように使用され、どのように統合されるかに関する最小限の制限
応用。 生成されたコードには依存関係がありません。
OPTIONS
-h, -H, -?, - 助けて
ヘルプを表示して終了します。
-v バージョン情報を印刷して終了します。
-o file
出力をファイルに書き込みます。 -o が指定されていない場合は、デフォルトのファイル名が選択されます。
入力ファイルのファイル拡張子を置き換えます。 .rh で終わるソース ファイルの場合、
接尾辞 .h が使用されます。 他のすべてのソース ファイルの場合は、出力言語に基づくサフィックス
が使用されます (.c、.cpp、.m など)。 Graphviz 出力に -o が指定されていない場合、生成される
dot ファイルは標準出力に書き込まれます。
-s 標準エラーにいくつかの統計を出力します。
--error-format=gnu
「ファイル:行:列:」の形式を使用してエラー メッセージを出力します (デフォルト)。
--error-format=msvc
「file(line,column):」形式を使用してエラー メッセージを出力します。
-d 重複したアクションをアクション リストから削除しないでください。
-I DIR
インクルードおよびインポートされたファイルを検索するディレクトリのリストに dir を追加します。
-n 状態の最小化を実行しません。
-m ステート マシンのコンパイルの最後に、最小化を XNUMX 回実行します。
-l ほぼすべての操作後に最小化します。 ユニオンなどの同様の操作のリストは次のとおりです。
最後に一度最小化します。 これはデフォルトの最小化オプションです。
-e 操作のたびに最小化してください。
-x ステート マシンをコンパイルし、ホスト データと
マシン。
-V Graphviz 用のドット ファイルを生成します。
-p ラベルに印刷可能な文字を表示します。
-S
出力するFSM仕様。
-M
出力するマシンの定義/インスタンス化。
-C ホスト言語は C、C++、Obj-C、または Obj-C++ です。 これはデフォルトのホスト言語です
オプションを選択します。
-D ホスト言語は D です。
-J ホスト言語は Java です。
-Z ホスト言語は Go です。
-R ホスト言語はRubyです。
-L #line ディレクティブの書き込みを禁止します。
-T0、XNUMX (C/D/Java/Ruby/C#/Go) テーブル駆動の FSM を生成します。 これはデフォルトのコードスタイルです。
テーブル駆動 FSM はステート マシンを静的データとして表します。 テーブルもあります
状態、遷移、インデックス、およびアクションの。 現在の状態は次の場所に保存されます。
変数。 実行は、現在の状態と状況を考慮したループです。
処理する現在のキャラクターは、二分探索を使用して移行するトランジションを検索します。
任意のアクションを実行し、ターゲット状態に移行します。 一般に、テーブル駆動
FSM はより小さなバイナリを生成し、より安価なホスト言語コンパイルを必要とします。
ただし、コードの実行速度は遅くなります。 テーブル駆動 FSM は、あらゆる FSM に適しています。
-T1、XNUMX (C/D/Ruby/C#/Go) のアクション リストを拡張することで、より高速なテーブル駆動型 FSM を生成します。
アクション実行コード。
-F0 (C/D/Ruby/C#/Go) フラット テーブル駆動の FSM を生成します。 遷移は次のように表されます。
現在のアルファベット文字によってインデックスが付けられた配列。 これにより、
二分探索を使用して遷移を特定し、より高速なコードを生成しますが、それは単なる
小さなアルファベットに適しています。
-F1 (C/D/Ruby/C#/Go) アクション リストを拡張して、より高速なフラット テーブル駆動の FSM を生成します。
アクションでコードを実行します。
-G0 (C/D/C#/Go) goto 駆動の FSM を生成します。 goto 駆動の FSM は状態を表します
machine を一連の goto ステートメントとして扱います。 マシン内の現在の状態は次のとおりです。
プロセッサの命令ポインタによって格納されます。 実行はフラット関数です
ここで制御は goto を使用して状態から状態に渡されます。 一般に、goto FSM
より高速なコードが生成されますが、バイナリが大きくなり、ホストがより高価になります。
言語コンパイル。
-G1 (C/D/C#/Go) のアクション リストを拡張することで、より高速な goto ドリブン FSM を生成します。
アクションはコードを実行します。
-G2 (C/D/Go) アクション リストを埋め込むことで、非常に高速な goto ドリブン FSM を生成します。
ステートマシン制御コード。
-P (C/D) N-Way Split は非常に高速な goto 駆動の FSM。
レーゲル 入力
注: これは、Ragel 入力の非常に簡単な説明です。 ラゲルについてさらに詳しく説明します
ホームページから入手できるユーザー ガイドを参照してください (下記を参照)。
Ragel は通常、入力ファイルを出力に直接渡します。 FSM を見たとき
マシンのインスタンス化を含む仕様では、ステート マシンの生成が停止されます。
write ステートメント (「write exec」など) がある場合、ragel は対応するステートメントを発行します。
コード。 入力ファイルには FSM 仕様をいくつでも含めることができます。 複数行の FSM
仕様は「%%{」で始まり「}%%」で終わります。 単一行の FSM 仕様
%% で始まり、最初の改行で終わります。
FSM 声明
エスプレッソマシン お名前:
マシンの名前を設定します。 指定する場合は、それが最初のステートメントである必要があります。
アルファベット タイプ:
アルファベットのデータ型を設定します。
キーの取得:
要素の型からアルファベット文字を取得する方法を指定します。
含めます:
現在のマシンと同じ名前のマシン、または別の名前のマシンを、
現在のファイルまたは他のファイル。
Action 定義:
FSM によって呼び出すことができるアクションを定義します。
FSM バランスの定義、 インスタンス化 および 最長 一致 インスタンス化:
FSM の構築に使用されます。 次のいくつかのセクションで構文の説明をします。
アクセス:
永続的なステート マシン変数にアクセスする方法を指定します。
書きます: マシンのコンポーネントを作成します。
変数:
デフォルトの変数名 (p、pe、cs、act など) をオーバーライドします。
BASIC MACHINES
基本マシンは、正規言語表現の基本オペランドです。
'こんにちは'
連結リテラル。 文字列内の文字の連結を生成します。 サポート
「\」を使用したエスケープシーケンス。 結果には開始状態と次への遷移が含まれます。
文字列内の各文字の新しい状態。 シーケンスの最後の状態は、
最終的にされる。 文字列の大文字と小文字を区別しないようにするには、次のように文字列に「i」を追加します。
「cmd」で。
"こんにちは"
一重引用符バージョンと同じです。
[こんにちは]
あるいは文字通り。 文字の結合を生成します。 「-」を含む文字範囲をサポートします。
最初の '^' で結合の意味を否定し、'\' でエスケープ シーケンスを否定します。
結果には XNUMX つの状態があり、文字ごとにそれらの間の遷移が発生します。
または範囲。
注: ''、""、および [] はヌル FSM を生成します。 Null マシンには、開始状態である XNUMX つの状態があります。
状態と最終状態を比較し、長さ XNUMX の文字列と一致します。 ヌルマシンが作成される可能性があります
null 組み込みマシンを使用します。
整数
指定された整数で XNUMX つの遷移を持つ XNUMX つのステート マシンを作成します。
16進法 指定された XNUMX 進数で XNUMX つの遷移を持つ XNUMX つのステート マシンを作成します。
/simple_regex/
単純な正規表現。 「.」、「*」、「[]」の表記をサポートします。
「-」で範囲を指定し、最初の「^」で OR 式の意味を否定します。
「\」を使用したエスケープシーケンス。 次の XNUMX つの末尾フラグもサポートします。 それを使用して、
/GET/i のように、大文字と小文字を区別しない正規表現。
リット .. リット
範囲を指定します。 許容される上限と下限は、次の連結リテラルです。
長さ 0 と番号のマシン。 たとえば、10x0..20x0、63..XNUMX、および 'a'..'z' は次のようになります。
有効な範囲。
変数名
指定された変数名に割り当てられたマシン定義を参照します。
内蔵マシン
利用可能な組み込みマシンがいくつかあります。 これらはすべて、次の XNUMX つのステート マシンです。
文字の共通クラスを一致させる目的。 彼らです:
どれか アルファベットの任意の文字。
アスキー アスキー文字 0..127。
伸ばす ASCII 拡張文字。 これは、署名付きアルファベットの場合は -128..127 の範囲です。
符号なしアルファベットの範囲は 0..255 です。
アルファ 英字/[A-Za-z]/.
桁 数字 /[0-9]/.
アルナム 英数字 /[0-9A-Za-z]/.
下側 小文字 /[az]/.
アッパー 大文字 /[AZ]/.
x桁 0 進数 /[9-XNUMXA-Fa-f]/.
コントロール 制御文字 0 ~ 31。
グラフ グラフィック文字 /[!-~]/.
印刷 印刷可能な文字 /[ -~]/.
ポイント 句読点。 英数字ではない図形文字
/[!-/:-@\[-`{-~]/.
スペース 空白 /[\t\v\f\n\r ]/.
ヌル 長さゼロの文字列。 ''、""、および [] に相当します。
空の 空集合。 何も一致しません。
BRIEF オペレーター REFERENCE
演算子は優先順位に従ってグループ化され、グループ 1 が最も低く、グループ 6 が最も高くなります。
GROUP 1:
式 , 式
トランジションを描画したり、開始状態を設定したりせずにマシンを結合します。
任意の最終状態。 開始状態は、「start」ラベルを使用して明示的に指定する必要があります。
最終状態は、暗黙的にイプシロン遷移を使用して指定できます。
「最終」状態を作成しました。
GROUP 2:
式 | 式
マシン XNUMX またはマシン XNUMX の任意の文字列に一致するマシンを生成します。
式 & 式
マシン XNUMX とマシンの両方にある文字列に一致するマシンを生成します
二。
式 - 式
マシン XNUMX にはあるがマシン XNUMX には存在しない任意の文字列と一致するマシンを生成します。
マシン2。
式 -- 式
強力な引き算。 文字列を持たないマシン XNUMX の任意の文字列と一致します。
マシン XNUMX では部分文字列として。
GROUP 3:
式 . 式
マシン XNUMX のすべての文字列とその後に続くすべての文字列に一致するマシンを生成します。
マシン XNUMX の文字列。
式 :> 式
エントリ保護された連結: マシン XNUMX へのエントリ時にマシン XNUMX を終了します。
式 :>> 式
終了保護連結: マシン XNUMX が終了するとマシン XNUMX を終了します。
式 <: 式
Left-Guarded Concatenation: マシン XNUMX に高い優先順位を与えます。
注: 連結はデフォルトの演算子です。 何もない状態で隣り合った XNUMX 台のマシン
それらの間の演算子を使用すると、連結演算が行われます。
GROUP 4:
ラベル: 式
式にラベルを付けます。 ラベルはイプシロン遷移や
アクション内の fgoto および fcall ステートメント。 マシンの参照にも注意してください。
この定義により、同じ名前のラベルが暗黙的に作成されます。
GROUP 5:
式 -> ラベル
ラベルで定義された状態へのイプシロン遷移を描画します。 ラベルは次の名前である必要があります
現在のスコープ。 イプシロン遷移は、カンマ演算子が次の場合に解決されます。
評価され、マシンの式ツリーのルートに配置されます。
割り当て/インスタンス化。
GROUP 6:
アクションは、アクション ステートメントで事前に定義された名前である場合もあれば、直接指定される場合もあります。
式に「{」と「}」を使用します。
式 > アクション
開始トランジションにアクションを埋め込みます。
式 @ アクション
最終状態に移行する遷移にアクションを埋め込みます。
式 $ アクション
すべてのトランジションにアクションを埋め込みます。 保留中の遷移は含まれません。
式 % アクション
最終状態からの保留中の遷移にアクションを埋め込みます。
GROUP 6: EOF
マシンの終了ルーチンが呼び出されると、現在の状態の EOF アクションが実行されます。
式 >/ アクション
EOF アクションを開始状態に埋め込みます。
式 </ アクション
EOF アクションを開始状態を除くすべての状態に埋め込みます。
式 $/ アクション
EOF アクションをすべての状態に埋め込みます。
式 %/ アクション
EOF アクションを最終状態に埋め込みます。
式 @/ アクション
最終的ではないすべての状態に EOF アクションを埋め込みます。
式 <>/ アクション
EOF アクションを開始状態以外のすべての状態に埋め込みます。
最終(中間州)。
GROUP 6: グローバル エラー
グローバル エラー アクションは、最終ステート マシンが完全に完了するまでステートに保存されます。
建設されました。 その後、それらはエラー遷移に転送され、
デフォルトのアクション。
式 >! アクション
グローバル エラー アクションを開始状態に埋め込みます。
式 <! アクション
開始状態を除くすべての状態にグローバル エラー アクションを埋め込みます。
式 $! アクション
グローバル エラー アクションをすべての状態に埋め込みます。
式 %! アクション
グローバル エラー アクションを最終状態に埋め込みます。
式 @! アクション
最終的ではないすべての状態にグローバル エラー アクションを埋め込みます。
式 <>! アクション
開始状態ではないすべての状態にグローバル エラー アクションを埋め込みます。
最終的なものではありません(中間州)。
GROUP 6: ローカル エラー
ローカル エラー アクションは、指定されたマシンが完全に構築されるまで状態に保存されます。
その後、それらはエラー遷移に転送され、デフォルトのアクションの効果が与えられます。
マシン全体の一部。 名前は省略できることに注意してください。その場合、
アクションは、現在のマシンの構築時にエラー アクションに転送されます。
式 >^ アクション
ローカル エラー アクションを開始状態に埋め込みます。
式 <^ アクション
開始状態を除くすべての状態にローカル エラー アクションを埋め込みます。
式 $^ アクション
ローカル エラー アクションをすべての状態に埋め込みます。
式 %^ アクション
ローカルエラーアクションを最終状態に埋め込みます。
式 @^ アクション
最終的ではないすべての状態にローカル エラー アクションを埋め込みます。
式 <>^ アクション
開始状態ではないすべての状態にローカル エラー アクションを埋め込みます。
最終的なものではありません(中間州)。
GROUP 6: 州へ
ステートへのアクションはステートに保存され、マシンが次の状態に移行するたびに実行されます。
州。 これには、通常の遷移や、fgoto などの制御の転送が含まれます。 ノート
マシンの外部から現在の状態を設定すること (たとえば、
初期化)は、状態への遷移としてカウントされません。
式 >~ アクション
状態遷移アクションを開始状態に埋め込みます。
式 <~ アクション
開始状態を除くすべての状態に状態遷移アクションを埋め込みます。
式 $~ アクション
to-state アクションをすべての状態に埋め込みます。
式 %~ アクション
to-state アクションを最終状態に埋め込みます。
式 @~ アクション
最終状態ではないすべての状態に to-state アクションを埋め込みます。
式 <>〜 アクション
開始状態ではないすべての状態に状態遷移アクションを埋め込みます。
最終(中間州)。
GROUP 6: 州から
ステートからのアクションは、キャラクターのステートが遷移するたびに実行されます。 これ
エラー遷移と自己への遷移が含まれます。
式 >* アクション
from-state アクションを開始状態に埋め込みます。
式 <* アクション
from-state アクションを開始状態を除くすべての状態に埋め込みます。
式 $* アクション
from-state アクションをすべての状態に埋め込みます。
式 %* アクション
from-state アクションを最終状態に埋め込みます。
式 @* アクション
最終状態ではないすべての状態に from-state アクションを埋め込みます。
式 <>* アクション
開始状態ではないすべての状態に from-state アクションを埋め込みます。
最終(中間州)。
GROUP 6: 優先 譲渡
トランジション内の名前には優先順位が割り当てられます。 同じ名前の優先順位のみが優先されます。
対話することが許可されています。 優先順位の最初の形式では、名前のデフォルトは、
優先順位が割り当てられているマシン定義。遷移にはデフォルトがありません。
優先順位。
式 > int型
開始状態から出るすべての遷移に優先順位 int を割り当てます。
式 @ int型
最終状態に移行するすべての遷移に優先順位 int を割り当てます。
式 $ int型
既存のすべてのトランジションに優先順位 int を割り当てます。
式 % int型
すべての保留中の遷移に優先順位 int を割り当てます。
優先順位の割り当ての XNUMX 番目の形式では、プログラマが優先順位の割り当て先の名前を指定できます。
優先順位が割り当てられるため、マシン定義の境界を越えた対話が可能になります。
式 > (名前,整数)
開始状態から出るすべての遷移で、優先順位 int を name に割り当てます。
式 @ (名前、 int)
最終状態に移行するすべての遷移で、優先順位 int を name に割り当てます。
式 $ (名前、 int)
既存のすべてのトランジションで、優先順位 int を name に割り当てます。
式 % (名前、 int)
すべての保留中の遷移で、優先順位 int を name に割り当てます。
GROUP 7:
式 * マシンのクリーンスターを生成します。 XNUMX 回以上の繰り返しに一致します。
機械。
式 **
最長一致のクリーン スター。 このバージョンの kleene star では、
ラップして最初からやり直すよりも、マシンに留まるのです。 この演算子は
( ( expr ) $0 %1 )* と同等。
式 ? 指定されたマシンまたは null 文字列を受け入れるマシンを生成します。 この演算子
は ( expr | '' ) と同等です。
式 + 自身のクリーンスターと連結したマシンを生成する。 いずれかに一致する、または
マシンをさらに繰り返します。 この演算子は ( expr . expr* ) と同等です。
式 {NS}
expr の n 回の繰り返しに正確に一致するマシンを生成します。
式 {,n}
expr の XNUMX 回から n 回の繰り返しに一致するマシンを生成します。
式 {NS、}
expr の n 回以上の繰り返しに一致するマシンを生成します。
式 {n、m}
expr の n ~ m 回の繰り返しに一致するマシンを生成します。
GROUP 8:
! 式 指定されたマシンに一致しない文字列に一致するマシンを生成します。 これ
演算子は ( *extend - expr ) と同等です。
^ 式 文字レベルの否定。 単一文字に一致しない任意の XNUMX 文字と一致します。
キャラクターマシン式
GROUP 9:
( 式 )
演算子の優先順位を強制します。
VALUES AVAILABLE IN CODE ブロック
fc 現在のキャラクター。 *p と同等。
fpc 現在の文字へのポインタ。 pに相当します。
カーソル 現在の状態を表す整数値。
fargs ターゲットの状態を表す整数値。
フェントリー( )
エントリ ポイントを表す整数値。
声明 AVAILABLE IN CODE ブロック
ホールド; 現在のキャラクターを超えて進まないでください。 --p; と同等。
フェセック ;
現在の文字を別の文字に設定します。 p = (と同等)-1;
fgoto ;
で定義されたマシンにジャンプします。
fgoto * ;
で指定されたエントリ ポイントにジャンプします。 。 式は整数に評価される必要があります
状態を表す値。
次へ ;
次の状態を で定義されたエントリ ポイントに設定します。 fnext ステートメント
指定された状態にすぐにはジャンプしません。 に続くアクション コードは、
ステートメントが実行されます。
次へ * ;
次の状態を次のエントリ ポイントに設定します。 。 式は次のとおりです。
状態を表す整数値に評価されます。
呼び出し ;
で定義されたマシンを呼び出します。 次のフレットはターゲットにジャンプします。
アクションが呼び出される遷移。
呼び出し * ;
で指定されたエントリ ポイントを呼び出します。 。 次のフレットはターゲットにジャンプします。
アクションが呼び出される遷移。
フレット; 最後の fcall が行われた遷移のターゲット状態に戻ります。
休憩;
現在の状態を保存し、すぐにマシンから抜け出します。
CREDITS
ラゲルはエイドリアン・サーストンによって書かれました[メール保護]>。 Objective-C 出力
エリック・オーシャンによる寄稿。 D 出力は Alan West によって提供されました。 Ruby 出力の貢献者
ヴィクトル・ユーゴ・ボルハ。 C Sharp コード生成は Daniel Tang によって提供されました。 への貢献
Colin Fleming による Java コード生成。 Go コード生成は Justine Tunney によって提供されました。
onworks.net サービスを使用してオンラインで ragel を使用する