これは、Ubuntu Online、Fedora Online、Windowsオンラインエミュレーター、MACOSオンラインエミュレーターなどの複数の無料オンラインワークステーションのXNUMXつを使用してOnWorks無料ホスティングプロバイダーで実行できるコマンドgvprです。
プログラム:
NAME
gvpr-グラフパターンのスキャンおよび処理言語
SYNOPSIS
gvpr [-icnqV?] [ -o アウトファイル ] [ -a 引数 ] [ 'prog' | -f プログラムファイル ] [ ファイル ]
DESCRIPTION
gvpr (以前として知られています GPR)は、に触発されたグラフストリームエディタです awk。 入力をコピーします
グラフを出力に変換し、構造と属性を変換して、新しいグラフを作成する可能性があります
グラフ、または任意の情報の印刷。 グラフモデルは、
リブグラフ(3)。 特に、 gvpr ドット言語を使用してグラフを読み書きします。
基本的に、 gvpr で示される各入力グラフをトラバースします。 $G、各ノードとエッジにアクセスし、
入力プログラムで提供される述語アクションルールと一致させます。 ルールは
順番に評価されます。 trueと評価される各述語について、対応するアクションは次のとおりです。
実行されます。 トラバーサル中、アクセスされている現在のノードまたはエッジは次のように示されます。 $.
入力グラフごとに、で示されるターゲットサブグラフがあります。 $T、最初は空で使用済み
選択したエンティティと出力グラフを蓄積するには、 $O、最終処理に使用され、その後
出力に書き込まれます。 デフォルトでは、出力グラフはターゲットグラフです。 出力グラフ
プログラムで設定することも、限られた意味でコマンドラインで設定することもできます。
OPTIONS
次のオプションがサポートされています。
-a 引数
文字列 引数 空白で区切られたトークンに分割され、
で文字列として利用可能なトークン gvpr としてプログラム ARGV [0]、...、ARGV [ARGC-1].
一重引用符または二重引用符で囲まれた部分文字列内の空白文字、または前に
バックスラッシュは、区切り記号として無視されます。 一般に、バックスラッシュ文字はオフになります
次の文字の特別な意味。 から派生したトークンに注意してください
の試合に -a フラグは連結されます。
-c ソースグラフを出力グラフとして使用します。
-i 次のコンテキストで、出力グラフのノード誘導部分グラフ拡張を導出します。
そのルートグラフ。
-o アウトファイル
出力ストリームを指定されたファイルに書き込みます。 デフォルトでは、出力は
に書き込ま (Linuxで言うところのstdout).
-f プログラムファイル
指定されたファイルの内容を、入力で実行するプログラムとして使用します。 もしも
プログラムファイル スラッシュ文字が含まれている場合、その名前はファイルのパス名として使用されます。
さもないと、 gvpr 環境変数で指定されたディレクトリを使用します
GVPRPATH ファイルを探します。 もしも -f 与えられていない、 gvpr 最初の非
プログラムとしてのオプション引数。
-q 警告メッセージをオフにします。
-n グラフの先読みをオフにします。 デフォルトでは、変数 $ NG 次のグラフに設定されます
処理されます。 これには、処理する前に次のグラフを読み取る必要があります
現在のグラフ。次のグラフがに応答してのみ生成される場合はブロックされる可能性があります
現在のグラフの処理に関連するアクション。
-V プログラムにバージョン情報を出力させて終了させます。
-? プログラムに使用状況情報を出力させて終了させます。
オペランド
次のオペランドがサポートされています。
ファイル ドット言語で1つ以上のグラフを含むファイルの名前。 いいえの場合 -f オプション
が指定されると、名がリストから削除され、入力プログラムとして使用されます。
ファイルのリストが空の場合、 stdin 使用されます。
プログラム
A gvpr プログラムは、次のいずれかの形式の述語アクション句のリストで構成されます。
ベギン { アクション }
BEG_G { アクション }
N [ 述語 ] { アクション }
E [ 述語 ] { アクション }
END_G { アクション }
終わり { アクション }
プログラムには、最大で各XNUMXつを含めることができます。 ベギン, END_G & 終わり 条項。 あります
任意の数である BEG_G, N & E ステートメント、最初はグラフに適用され、XNUMX番目は
ノード、エッジのXNUMX番目。 これらはブロックに分けられ、ブロックは
任意 BEG_G ステートメントとすべて N & E 次までのステートメント BEG_G ステートメント、もし
どれか。 のトップレベルのセマンティクス gvpr プログラムは次のとおりです。
評価する ベギン 条項がある場合。
各入力グラフについて G {
ブロックごとに{
作成セッションプロセスで G 現在のグラフと現在のオブジェクトとして。
評価する BEG_G 条項がある場合。
各ノードとエッジについて G {
ノードまたはエッジを現在のオブジェクトとして設定します。
評価する N or E 必要に応じて、条項。
}
}
作成セッションプロセスで G 現在のオブジェクトとして。
評価する END_G 条項がある場合。
}
評価する 終わり 条項がある場合。
のアクション ベギン, BEG_G, END_G & 終わり 節は、節が次の場合に実行されます
評価されました。 為に N or E 句、述語またはアクションのいずれかを省略できます。 もしそこにあるなら
はアクションの述語ではなく、アクションはすべてのノードまたはエッジで実行されます。
適切な。 アクションがなく、述部がtrueと評価された場合、関連する
ノードまたはエッジがターゲットグラフに追加されます。
ブロックは、発生順に評価されます。 ブロック内では、 N 句
(E 条項はそれぞれ)発生順に評価されます。 ただし、注意してください
ブロック内のそれ、 N or E トラバーサルの順序によっては、句がインターレースされる場合があります。
述語とアクションは、C方言でサポートされているステートメントのシーケンスです。
式(3)ライブラリ。 述語とアクションの唯一の違いは、前者が
trueまたはfalseのいずれかとして解釈される可能性のあるタイプである必要があります。 ここでは通常のC
ゼロ以外の値が真であると見なされる規則に従います。 これには以下が含まれます
空でない文字列およびノード、エッジなどへの空でない参照。ただし、文字列が可能である場合
整数に変換される場合、この値が使用されます。
通常のCベースタイプに加えて(ボイド, int型, チャリオット, フロート, 長い, 署名されていない & ),
gvpr は、大阪で 文字列 の同義語として char *、およびグラフベースのタイプ ノードt, エッジ_t,
グラフ_t & オブジェクトを選択します。 オブジェクト タイプは他の3つのコンクリートのスーパータイプと見なすことができます
種類; 正しい基本タイプは動的に維持されます。 これらの基本タイプに加えて、
サポートされている他の型式のみが(連想)配列です。
定数はC構文に従いますが、文字列はどちらかで引用できます 「……」 or 「...」. gvpr
C++コメントとcppタイプのコメントを受け入れます。 後者の場合、行がで始まる場合
'#'文字の場合、残りの行は無視されます。
ステートメントは、関数、変数または配列、または実行可能ファイルの宣言にすることができます
声明。 宣言には、単一のスコープがあります。 配列宣言の形式は次のとおりです。
type 配列 [ type0 ]
コラボレー type0 オプションです。 提供されている場合、パーサーはそのすべての配列を強制します
下付き文字には指定されたタイプがあります。 提供されていない場合、すべてのタイプのオブジェクトは
下付き文字として使用されます。 Cと同様に、変数と配列を宣言する必要があります。 特に、
宣言されていない変数は、ノード、エッジ、または
コンテキストに応じて、グラフ。
実行可能ステートメントは、次のいずれかになります。
{ [ ステートメント ... ] }
表現 //一般的に VAR = 表現
もし( 表現 ) ステートメント [ ほかに ステートメント ]
にとって( 表現 ; 表現 ; 表現 ) ステートメント
にとって( 配列 [ VAR ]) ステートメント
forr( 配列 [ VAR ]) ステートメント
その間( 表現 ) ステートメント
スイッチ( 表現 ) 場合 文
破る [ 表現 ]
続ける [ 表現 ]
return [ 表現 ]
括弧内の項目はオプションです。
のXNUMX番目の形式では for ステートメントと フォー ステートメント、変数 VAR に設定されています
指定された配列でインデックスとして使用され、次に関連付けられた各値 ステートメント is
評価されました。 数値インデックスと文字列インデックスの場合、インデックスは増加して返されます
(減少)の数値または辞書式順序 for (フォー、 それぞれ)。 これは使用できます
ソート用。
関数定義は、 ベギン 句。
式には通常のC式が含まれます。 を使用した文字列比較 == & != 治療する
正規表現マッチングを目的としたパターンとしての右側のオペランド。 パターン
つかいます kshの(1)ファイル一致パターンの構文。 (単純な文字列の同等性については、 strcmp
機能。
gvpr 必要に応じて、式を文字列または数値として使用しようとします。 両方
Cのようなキャストと関数テンプレートにより、可能であれば変換が実行されます。
グラフィックタイプの式(つまり、 グラフ_t、 node_t、 edge_t、 オブジェクト)の後に
次の形式のフィールド参照 .名。 結果の値は属性の値です
命名 名 与えられたオブジェクトの。 さらに、特定のコンテキストでは、宣言されていない、
変更されていない識別子は属性名と見なされます。 具体的には、そのような識別子
現在のノードまたはエッジの属性をそれぞれ示します。 N & E 条項、および
の現在のグラフ BEG_G & END_G 条項。
いつものように リブグラフ(3)モデル、属性は文字列値です。 加えて、 gvpr
グラフオブジェクトの特定の疑似属性をサポートしますが、必ずしも文字列値である必要はありません。 これらは
グラフオブジェクトの固有のプロパティを反映し、ユーザーが設定することはできません。
: ノードt
エッジの頭。
tail : ノードt
エッジの尾。
名 : 文字列
エッジ、ノード、またはグラフの名前。 エッジの名前の形式は「<tail‐
名前>[]"、 どこ "->"または"--" 応じて
グラフが方向付けられているかどうか。 ブラケット部分 [] 次の場合にのみ表示されます
エッジには重要なキーがあります。
インディグリー : int型
ノードの程度。
アウトディグリー : int型
ノードのアウトディグリー。
度 : int型
ノードの次数。
ルート : グラフ_t
オブジェクトのルートグラフ。 ルートグラフのルートはそれ自体です。
親 : グラフ_t
サブグラフの親グラフ。 ルートグラフの親は NULL
n_edges : int型
グラフのエッジの数
n_nodes : int型
グラフ内のノードの数
指示された : int型
グラフが指示されている場合はtrue(ゼロ以外)
厳格な : int型
グラフが厳密な場合はtrue(ゼロ以外)
ビルトイン 関数
以下の機能が組み込まれています gvpr。 グラフへの参照を返す関数
オブジェクトが返されます NULL 失敗した場合。
グラフ & サブグラフ
グラフ(s : 文字列, t : 文字列): グラフ_t
名前がであるグラフを作成します s タイプが文字列で指定されている t.
大文字と小文字を無視して、文字 U, D, S, N 解釈を無向にし、
それぞれ、directed、strict、およびnon-strictです。 もしも t 空で、指示された、非
厳密なグラフが生成されます。
サブグ(g : グラフ_t, s : 文字列): グラフ_t
グラフにサブグラフを作成します g 名前付き s。 サブグラフがすでに存在する場合は、
戻ってきた。
isSubg(g : グラフ_t, s : 文字列): グラフ_t
グラフのサブグラフを返します g 名前付き s、存在する場合、または NULL さもないと。
fstsubg(g : グラフ_t): グラフ_t
グラフの最初のサブグラフを返します gまたは NULL 存在しない場合。
nxtsubg(sg : グラフ_t): グラフ_t
次のサブグラフを返します sgまたは NULL.
isDirect(g : グラフ_t): int型
次の場合にのみtrueを返します g 監督されています。
厳しいです(g : グラフ_t): int型
次の場合にのみtrueを返します g 厳しいです。
nノード(g : グラフ_t): int型
のノード数を返します g.
エッジ(g : グラフ_t): int型
のエッジの数を返します g.
Nodes
(sg : グラフ_t, s : 文字列): ノードt
グラフにノードを作成します g 名前の s。 そのようなノードがすでに存在する場合は、それが返されます。
サブノード(sg : グラフ_t, n : ノードt): ノードt
ノードを挿入します n サブグラフに g。 ノードを返します。
fstノード(g : グラフ_t): ノードt
グラフの最初のノードを返します gまたは NULL 存在しない場合。
nxtnode(n : ノードt): ノードt
次のノードを返します n ルートグラフで、または NULL.
nxtnode_sg(sg : グラフ_t, n : ノードt): ノードt
次のノードを返します n in sgまたは NULL.
isNode(sg : グラフ_t, s : 文字列): ノードt
(サブ)グラフでノードを探します sg 名前の s。 そのようなノードが存在する場合は、それが返されます。
さもないと、 NULL 返されます。
isサブノード(sg : グラフ_t, n : ノードt): int型
ノードの場合はゼロ以外を返します n (サブ)グラフにあります sg、またはそれ以外の場合はゼロ。
度数(sg : グラフ_t, n : ノードt): int型
ノードの度数を返します n (サブ)グラフ sg.
アウトディグリーオブ(sg : グラフ_t, n : ノードt): int型
ノードのアウトディグリーを返します n (サブ)グラフ sg.
度の(sg : グラフ_t, n : ノードt): int型
ノードの次数を返します n (サブ)グラフ sg.
エッジ
エッジ(t : ノードt, h : ノードt, s : 文字列): エッジ_t
テールノードでエッジを作成します t、ヘッドノード h と名前 s ルートグラフで。 の場合
グラフは無向であり、ヘッドノードとテールノードの区別は重要ではありません。
そのようなエッジがすでに存在する場合は、それが返されます。
エッジ_sg(sg : グラフ_t, t : ノードt, h : ノードt, s : 文字列): エッジ_t
テールノードでエッジを作成します t、ヘッドノード h と名前 s (サブ)グラフ sg (そしてすべて
親グラフ)。 グラフが無向の場合、頭と尾の区別
ノードは重要ではありません。 そのようなエッジがすでに存在する場合は、それが返されます。
サブエッジ(g : グラフ_t, e : エッジ_t): エッジ_t
エッジを挿入します e サブグラフに g。 エッジを返します。
エッジ(t : ノードt, h : ノードt, s : 文字列): エッジ_t
テールノードのあるエッジを探します t、ヘッドノード h と名前 s。 グラフが
無向の場合、ヘッドノードとテールノードの区別は重要ではありません。 そのような場合
エッジが存在する場合は返されます。 さもないと、 NULL 返されます。
isEdge_sg(sg : グラフ_t, t : ノードt, h : ノードt, s : 文字列): エッジ_t
テールノードのあるエッジを探します t、ヘッドノード h と名前 s (サブ)グラフ sg。 もし
グラフは無向であり、ヘッドノードとテールノードの区別は重要ではありません。
そのようなエッジが存在する場合は、それが返されます。 さもないと、 NULL 返されます。
サブエッジです(g : グラフ_t, e : エッジ_t): int型
エッジの場合はゼロ以外を返します e (サブ)グラフにあります sg、またはそれ以外の場合はゼロ。
フスタウト(n : ノードt): エッジ_t
ノードの最初のアウトエッジを返します n ルートグラフで。
fstout_sg(sg : グラフ_t, n : ノードt): エッジ_t
ノードの最初のアウトエッジを返します n (サブ)グラフ sg.
ネクストアウト(e : エッジ_t): エッジ_t
次のアウトエッジを返します e ルートグラフで。
nxtout_sg(sg : グラフ_t, e : エッジ_t): エッジ_t
次のアウトエッジを返します e グラフで sg.
フスティン(n : ノードt): エッジ_t
ノードの最初のインエッジを返します n ルートグラフで。
fstin_sg(sg : グラフ_t, n : ノードt): エッジ_t
ノードの最初のインエッジを返します n グラフで sg.
ネクスティン(e : エッジ_t): エッジ_t
次のインエッジを返します e ルートグラフで。
nxtin_sg(sg : グラフ_t, e : エッジ_t): エッジ_t
次のインエッジを返します e グラフで sg.
フステッジ(n : ノードt): エッジ_t
ノードの最初のエッジを返します n ルートグラフで。
fstedge_sg(sg : グラフ_t, n : ノードt): エッジ_t
ノードの最初のエッジを返します n グラフで sg.
ネクスエッジ(e : エッジ_t, ノードt): エッジ_t
次のエッジを返します e ルートグラフで。
nxtedge_sg(sg : グラフ_t, e : エッジ_t, ノードt): エッジ_t
次のエッジを返します e グラフで sg.
OPP(e : エッジ_t, ノードt): ノードt
エッジ上のノードを返します e 等しくない n。 次の場合にNULLを返します n のノードではありません
e。 これは、を使用するときに役立ちます フステッジ & ネクスエッジ の隣人を列挙する
n.
グラフ I / O
書きます(g : グラフ_t): ボイド
プリント g ドット形式で出力ストリームに。
書き込みG(g : グラフ_t, fname : 文字列): ボイド
プリント g ドット形式でファイルに fname.
fwriteG(g : グラフ_t, fd : int型): ボイド
プリント g 整数で示されるオープンストリームへのドット形式 fd.
読むG(fname : 文字列): グラフ_t
ファイルから読み取ったグラフを返します fname。 グラフはドット形式である必要があります。 いいえの場合
グラフが読める、 NULL 返されます。
freadG(fd : int型): グラフ_t
オープンストリームから読み取られた次のグラフを返します fd。 戻り値 NULL ファイルの終わりに。
グラフ その他
削除(g : グラフ_t, x : オブジェクト): ボイド
オブジェクトを削除します x グラフから g。 場合 g is NULL、関数はのルートグラフを使用します
x。 場合 x グラフまたはサブグラフである場合を除き、閉じられます x ロックされています。
あります(g : グラフ_t, x : オブジェクト): int型
次の場合にtrueを返します x サブグラフにあります g.
クローンG(g : グラフ_t, s : 文字列): グラフ_t
グラフのクローンを作成します g の名前で s。 場合 s は""であり、作成されたグラフには
と同じ名前 g.
(g : グラフ_t, x : オブジェクト): オブジェクト
オブジェクトのクローンを作成します x グラフで g。 特に、新しいオブジェクトは同じです
元のオブジェクトとしての名前/値の属性と構造。 オブジェクトの場合
と同じキー x すでに存在し、その属性は x と
オブジェクトが返されます。 エッジが複製される場合、両方のエンドポイントが暗黙的に複製されます。
グラフが複製されると、すべてのノード、エッジ、およびサブグラフが暗黙的に複製されます。 もしも x
グラフです、 g 多分 NULL、この場合、複製されたオブジェクトは新しいルートになります
グラフ。 この場合、呼び出しはと同等です cloneG(x、"").
copy(g : グラフ_t, x : オブジェクト): オブジェクト
オブジェクトのコピーを作成します x グラフで g、ここで、新しいオブジェクトは同じ名前/値を持ちます
元のオブジェクトとしての属性。 と同じキーを持つオブジェクトの場合 x 既に
存在する場合、その属性は x オブジェクトが返されます。 ノート
これは浅いコピーです。 もしも x はグラフであり、そのノード、エッジ、またはサブグラフはありません
新しいグラフにコピーされます。 もしも x がエッジの場合、エンドポイントは次の場合に作成されます
必要ですが、クローンは作成されません。 もしも x グラフです、 g 多分 NULLその場合
複製されたオブジェクトは新しいルートグラフになります。
コピーA(SRC : オブジェクト, tgt : オブジェクト): int型
オブジェクトの属性をコピーします SRC 物申す tgt、属性値を上書きする
tgt 最初に持っているかもしれません。
誘発します(g : グラフ_t): ボイド
拡張する g ルートグラフのノード誘導部分グラフ拡張に。
属性あり(SRC : オブジェクト, 名 : 文字列): int型
オブジェクトの場合はゼロ以外を返します SRC 名前が 名。 0を返します
さもないと。
isAttr(g : グラフ_t, 種類 : 文字列, 名 : 文字列): int型
属性の場合はゼロ以外を返します 名 で定義されています g のオブジェクトの場合
与えられた 種類。 ノード、エッジ、およびグラフの場合、 種類 「N」、「E」、「G」である必要があります。
それぞれ。 それ以外の場合は0を返します。
老化する(SRC : オブジェクト, 名 : 文字列): 文字列
属性の値を返します 名 オブジェクト内 SRC。 これはそのような場合に役立ちます
いつ 名 「head」や「root」などのキーワードのXNUMXつと競合します。 の場合
属性がグラフで宣言されていない場合、関数はそれを次のように初期化します
デフォルト値は「」です。 これを回避するには、 属性あり or isAttr function
属性が存在することを確認します。
セット(SRC : オブジェクト, 名 : 文字列, 値 : 文字列): int型
属性の値を設定します 名 オブジェクト内 SRC 〜へ 値。 成功すると0を返します。
失敗するとゼロ以外。 見る 老化する 上記。
getDflt(g : グラフ_t, 種類 : 文字列, 名 : 文字列): 文字列
属性のデフォルト値を返します 名 のオブジェクトで g 与えられたの 種類。 のために
ノード、エッジ、グラフ、 種類 それぞれ「N」、「E」、「G」である必要があります。 の場合
属性がグラフで宣言されていない場合、関数はそれを次のように初期化します
デフォルト値は「」です。 これを回避するには、 isAttr チェックする機能
属性が存在すること。
セットDflt(g : グラフ_t, 種類 : 文字列, 名 : 文字列, 値 : 文字列): int型
属性のデフォルト値を設定します 名 〜へ 値 のオブジェクトで g 与えられたの
種類。 ノード、エッジ、およびグラフの場合、 種類 それぞれ「N」、「E」、「G」である必要があります。
成功した場合は0を返し、失敗した場合はゼロ以外を返します。 見る getDflt 上記。
fst属性(g : グラフ_t, 種類 : 文字列): 文字列
内のオブジェクトの最初の属性の名前を返します g 与えられたの 種類。 のために
ノード、エッジ、グラフ、 種類 それぞれ「N」、「E」、「G」である必要があります。 もしそこにあるなら
属性がない場合は、文字列""が返されます。
nxtAttr(g : グラフ_t, 種類 : 文字列, 名 : 文字列): 文字列
内のオブジェクトの次の属性の名前を返します g 与えられたの 種類 後に
属性を使用する。 名。 議論 名 既存の属性の名前である必要があります。 それ
通常、への前回の呼び出しの戻り値になります fst属性 or nxtAttr。 のために
ノード、エッジ、グラフ、 種類 それぞれ「N」、「E」、「G」である必要があります。 もしそこにあるなら
属性が残っていない場合は、文字列""が返されます。
コンプオブ(g : グラフ_t, n : ノードt): グラフ_t
グラフの連結成分を返します g ノードを含む n、のサブグラフとして
g。 サブグラフにはノードのみが含まれます。 使用できます 誘発します エッジを追加します。 ザ
関数が失敗して戻ります NULL if n にない g。 接続性はに基づいています
の基礎となる無向グラフ g.
すこし(オブジェクト : オブジェクト): 文字列
タイプの表示を返します オブジェクト。 ノード、エッジ、およびグラフの場合、次のようになります。
それぞれ「N」、「E」、「G」。
ロック(g : グラフ_t, v : int型): int型
ルートグラフにグラフロックを実装します。 整数の場合 v が正の場合、グラフは
将来の呼び出しが 削除 すぐに効果はありません。 もしも v ゼロ、
グラフのロックが解除されます。 グラフを削除するための呼び出しがあった場合
ロックされている場合、グラフは閉じています。 もしも v 負の場合、何も行われません。 すべての場合において、
以前のロック値が返されます。
弦
スプリント(FMT : 文字列, ...): 文字列
式の値をフォーマットした結果の文字列を返します
後に発生 FMT による printf(3)フォーマット FMT
gサブ(STR : 文字列, パット : 文字列): 文字列
gサブ(STR : 文字列, パット : 文字列, 繰り返し : 文字列): 文字列
収益 STR すべての部分文字列が一致している パット 削除または置換 繰り返し,
。
以下(STR : 文字列, パット : 文字列): 文字列
以下(STR : 文字列, パット : 文字列, 繰り返し : 文字列): 文字列
収益 STR 左端の部分文字列が一致する パット 削除または置換 繰り返し,
それぞれ。 文字「^」および「$」は、最初と最後に使用できます。
それぞれ、 パット パターンを最初または最後に固定する STR.
substr(STR : 文字列, idx : int型): 文字列
substr(STR : 文字列, idx : int型, LEN : int型): 文字列
の部分文字列を返します STR 位置から開始 idx 文字列の最後までまたは
長さの LEN、 それぞれ。 インデックス作成は0から始まります。 idx 負または idx is
の長さよりも大きい STR、致命的なエラーが発生します。 同様に、XNUMX番目に
場合、 LEN 負または idx + LEN の長さよりも大きい STR、致命的
エラーが発生します。
strcmp(s1 : 文字列, s2 : 文字列): int型
標準のC関数を提供します strcmpとします。
長さ(s : 文字列): int型
文字列の長さを返します s.
index(s : 文字列, t : 文字列): int型
インデックス(s : 文字列, t : 文字列): int型
文字列の文字のインデックスを返します s 左端(右端)のコピー
文字列の t 見つけることができます、または-1の場合 t の部分文字列ではありません s.
match (s : 文字列, p : 文字列): int型
文字列の文字のインデックスを返します s パターンの左端の一致
p 見つけることができます。またはの部分文字列がない場合は-1 s マッチ p.
トッパー(s : 文字列): 文字列
のバージョンを返します s 英字を大文字に変換します。
低い(s : 文字列): 文字列
のバージョンを返します s 英字は小文字に変換されます。
カノン(s : 文字列): 文字列
のバージョンを返します s ドットファイルの識別子として使用するのに適しています。
HTML(g : グラフ_t, s : 文字列): 文字列
の「魔法の」バージョンを返します s HTML文字列として。 これは通常、
HTMLのようなラベルをグラフオブジェクトに添付します。 返された文字列はに存在することに注意してください
g。 特に、次の場合に解放されます g が閉じられ、HTML文字列として機能するために
のオブジェクトで使用する必要があります g。 さらに、山かっこに注意してください
引用符はの一部であってはなりません s。 これらは次の場合に追加されます g 具体的なDOTで書かれています
形式でダウンロードすることができます。
ishtml(s : 文字列): int型
次の場合にのみゼロ以外を返します s HTML文字列です。
xOf(s : 文字列): 文字列
文字列"を返しますx「もし s 「x,y"、ここで両方 x & y 数値です。
yOf(s : 文字列): 文字列
文字列"を返しますy「もし s 「x,y"、ここで両方 x & y 数値です。
XNUMX分のXNUMX(s : 文字列): 文字列
文字列"を返しますllx,ゆり「もし s 「llx,ゆり,ウルクス,ury"、ここですべて llx,
ゆり, ウルクス, ury 数値です。
urOf(s)
あなたの(s : 文字列): 文字列 文字列"を返しますウルクス,ury「もし s 形をしています
"llx,ゆり,ウルクス,ury"、ここですべて llx, ゆり, ウルクス, ury 数値です。
スキャンフ(s : 文字列, FMT : 文字列, ...): int型
文字列をスキャンします s、に従って値を抽出します スキャンフ(3)フォーマット FMTを選択します。
値は次のアドレスに保存されます FMT、形式を持つアドレス &v,
コラボレー v 正しい型の宣言された変数です。 アイテムの数を返します
正常にスキャンされました。
split(s : 文字列, ARR : 配列, 分離液 : 文字列): int型
split(s : 文字列, ARR : 配列): int型
トークン(s : 文字列, ARR : 配列, 分離液 : 文字列): int型
トークン(s : 文字列, ARR : 配列): int型
split 関数は文字列を壊します s フィールドに、 トークン function
文字列をトークンに分割します。 フィールドは、すべての非区切り文字で構成されます
XNUMXつの区切り文字の間、または文字列の先頭または末尾。 したがって、
フィールドは空の文字列である可能性があります。 トークンは最大の空でない部分文字列であり、
区切り文字を含みます。 区切り文字は、
分離液 口論。 もしも 分離液 が指定されていない場合、デフォルト値は「\ t\n」です。 The
関数は、フィールドまたはトークンの数を返します。
フィールドとトークンは引数配列に格納されます。 配列は 文字列-
値が付けられ、インデックスタイプが指定されている場合は、 int型。 エントリにはインデックスが付けられます
0から始まる連続した整数で。配列にすでに格納されている値はすべて
上書きされるか、関数が戻った後も存在し続けます。
I / O
印刷(...): ボイド
プリント( 式, ... ) 各引数の文字列表現を順番に出力します
(Linuxで言うところのstdout)、改行が続きます。
printf(FMT : 文字列, ...): int型
printf(fd : int型, FMT : 文字列, ...): int型
次の式の値をフォーマットした結果の文字列を出力します
FMT による printf(3)フォーマット FMT。 成功すると0を返します。 デフォルトでは、
に印刷 (Linuxで言うところのstdout)。 オプションの整数の場合 fd が与えられると、出力はに書き込まれます
に関連付けられたオープンストリーム fd.
scanf(FMT : 文字列, ...): int型
scanf(fd : int型, FMT : 文字列, ...): int型
に従って入力ストリームから値をスキャンします scanf(3)フォーマット FMTを選択します。
値は次のアドレスに保存されます FMT、形式を持つアドレス &v,
コラボレー v 正しい型の宣言された変数です。 デフォルトでは、
stdin。 オプションの整数の場合 fd が与えられると、入力はオープンストリームから読み取られます
関連付けられている fd。 正常にスキャンされたアイテムの数を返します。
オープンF(s : 文字列, t : 文字列): int型
ファイルを開きます s I/Oストリームとして。 文字列引数 t ファイルの状態を指定します
オープンしました。 引数はC関数の場合と同じです フォペン(3)。 それは
ストリームを示す整数、またはエラーの場合は-1。
いつものように、ストリーム0、1、2はすでに開いています。 stdin, (Linuxで言うところのstdout), stderr,
それぞれ。 以来 gvpr 使用することがあります stdin 入力グラフを読むには、ユーザーは
このストリームの使用は避けてください。
閉じるF(fd : int型): int型
整数で示されるオープンストリームを閉じます fd。 ストリーム0、1、および2はできません
閉まっている。 成功すると0を返します。
読み取りL(fd : int型): 文字列
入力ストリームから読み取られた次の行を返します fd。 空の文字列""を返します
ファイルの終わりに。 返された文字列には改行文字が残っていることに注意してください。
数学
EXP(d : ):
eをに返します dパワー。
ログ(d : ):
の自然対数を返します d.
平方根(d : ):
ダブルの平方根を返します d.
捕虜(d : , x : ):
収益 d に発生 xパワー。
COS(d : ):
のコサインを返します d.
罪(d : ):
の正弦を返します d.
あたん2(y : , x : ):
のアークタンジェントを返します y / x -piからpiの範囲。
MIN(y : , x : ):
の最小値を返します y & x.
MAX(y : , x : ):
の最大値を返します y & x.
連想 配列
# ARR : int型
配列内の要素の数を返します ARR.
idx in ARR : int型
インデックスに値が設定されている場合は1を返します idx 配列で ARR。 0を返します
さもないと。
unset(v : 配列, idx): int型
によってインデックス付けされたアイテムを削除します idx。 アイテムが存在する場合は1を返し、存在しない場合は0を返します。
unset(v : 配列): ボイド
アレイを再初期化します。
その他
終了する(v : int型): ボイド
原因 gvpr 終了コードで終了するには v.
(CMD : 文字列): int型
標準のC関数を提供します (3)。 実行します CMD ユーザーのシェルで
環境、およびシェルの終了ステータスを返します。
ランド():
0と1の間の疑似ランダムdoubleを返します。
地獄(): int型
地獄(v : int型): int型
乱数ジェネレーターのシードを設定します。 オプションの引数はシードを与えます。
省略した場合は、現在の時刻が使用されます。 以前のシード値が返されます。
地獄 を呼び出す前に呼び出す必要があります ランド.
色×(カラー : 文字列, FMT : 文字列): 文字列
色をある形式から別の形式に変換します。 The カラー 引数は色である必要があります
認識された文字列表現のXNUMXつ。 The FMT 値は次のいずれかである必要があります
「RGB」、「RGBA」、「HSV」、または「HSVA」。 エラーが発生すると、空の文字列が返されます。
ビルトイン 変数
gvpr 特定の特別な組み込み変数を提供します。その値はによって自動的に設定されます。
gvpr 状況に応じて。 特に記載のない限り、ユーザーは値を変更できません。
$ : オブジェクト
コンテキストに応じて、現在のオブジェクト(ノード、エッジ、グラフ)を示します。 そうではない
で利用可能 ベギン or 終わり 条項。
$F : 文字列
現在の入力ファイルの名前です。
$G : グラフ_t
処理中の現在のグラフを示します。 で利用できません ベギン or 終わり
条項。
$ NG : グラフ_t
次に処理されるグラフを示します。 もしも $ NG 現在のグラフであるNULL $G は
最後のグラフ。 入力がstdinからのものである場合、最後のグラフは
入力パイプが閉じるまで決定されます。 で利用できません ベギン or 終わり
条項、または -n フラグが使用されます。
$O : グラフ_t
出力グラフを示します。 グラフトラバーサルの前に、ターゲットに初期化されます
グラフ。 トラバーサル後および任意 END_G 空でないグラフを参照している場合、アクション、
そのグラフは出力ストリームに出力されます。 でのみ有効です N, E & END_G
条項。 出力グラフはユーザーが設定できます。
$T : グラフ_t
現在のターゲットグラフを示します。 のサブグラフです $G でのみ利用可能です
N, E & END_G 条項。
$ tgtname : 文字列
ターゲットグラフの名前を示します。 デフォルトでは、 「gvpr_result」。 場合
の実行中に複数回使用 gvpr、名前には
整数。 この変数はユーザーが設定できます。
$ tvroot : ノードt
(有向または無向)深さ優先または幅の開始ノードを示します。
グラフの最初の走査(cf. $ tvtype 下)。 デフォルト値は NULL for
各入力グラフ。 指定されたルートでのトラバーサル後、 $ tvroot
が変更された場合、新しいトラバーサルは次の新しい値で始まります。 $ tvroot。 また、セット
$ tvnext を参照してください。
$ tvnext : ノードt
(有向または無向)深さ優先の次の開始ノードを示しますまたは
グラフの幅優先探索(cf. $ tvtype 下)。 トラバーサルが終了した場合
と $ tvroot リセットされていませんが、 $ tvnext 設定されていますが使用されていません、これ
ノードは次の選択肢として使用されます $ tvroot。 デフォルト値は NULL for
各入力グラフ。
$ tvedge : エッジ_t
BFSおよびDFSトラバーサルの場合、これは現在の到達に使用されるエッジに設定されます
ノードまたはエッジ。 トラバーサルの開始時、または他のトラバーサルタイプの場合、
値は NULL.
$ tvtype : テレビタイプ_t
方法を示します gvpr グラフをトラバースします。 定数値のXNUMXつのみを取ることができます
以下に説明するprevix「TV_」を使用します。 TV_フラット デフォルトです。
基になるグラフライブラリ グラフ(3)、無向グラフのエッジには
任意の方向。 これは、次のようなトラバーサルに使用されます テレビ_転送、必要
有向エッジ。
ARGC : int型
によって指定された引数の数を示します -a 引数 コマンドライン引数。
ARGV : 文字列 配列
で指定された引数の配列を示します -a 引数 コマンドライン引数。 The
ith引数はによって与えられます ARGV [i].
ビルトイン 定数
によって定義されるいくつかのシンボリック定数があります gvpr.
NULL : オブジェクト
0に相当するnullオブジェクト参照。
TV_フラット : テレビタイプ_t
一見任意の順序でグラフオブジェクトが訪問される、単純でフラットなトラバーサル。
テレビネ : テレビタイプ_t
最初にすべてのノードを訪問し、次にすべてのエッジを訪問するトラバーサル。
テレビ : テレビタイプ_t
最初にすべてのエッジを訪問し、次にすべてのノードを訪問するトラバーサル。
TV_dfs : テレビタイプ_t
TV_postdfs : テレビタイプ_t
TV_prepostdfs : テレビタイプ_t
基礎となる無向の深さ優先探索を使用したグラフの走査
グラフ。 トラバーサルを行うには、 gvpr の値をチェックします $ tvroot。 これがある場合
以前と同じ値(開始時に、以前の値が初期化されます)
〜へ NULL。) gvpr 単に訪問されていないノードを探し、接続されているノードをトラバースします
成分。 一方、 $ tvroot 変更された場合、その連結成分は
以前に訪問したことがない場合、または $ tvroot is NULL
トラバーサルは停止します。 使用することに注意してください TV_dfs & $ tvroot、作成することが可能です
無限ループ。
デフォルトでは、トラバーサルは事前注文で行われます。 つまり、ノードは前に訪問されます
その未訪問のエッジのすべて。 為に TV_postdfs、ノードのすべての未訪問のエッジは
ノードの前に訪問しました。 為に TV_prepostdfs、ノードはXNUMX回訪問され、その前と
その未訪問のエッジのすべての後。
テレビ_転送 : テレビタイプ_t
TV_postfwd : テレビタイプ_t
TV_prepostfwd : テレビタイプ_t
次のグラフのみで深さ優先探索を使用したグラフの走査
フォワードアーク。 トラバーサルのルートの選択は、
TV_dfs その上。 によって指定された訪問の異なる順序 テレビ_転送, TV_postfwd
& TV_prepostfwd 類似のトラバーサルで指定されたものと同じです
TV_dfs, TV_postdfs & TV_prepostdfs.
TV_rev : テレビタイプ_t
TV_postrev : テレビタイプ_t
TV_prepostrev : テレビタイプ_t
次のグラフのみで深さ優先探索を使用したグラフの走査
逆アーク。 トラバーサルのルートの選択は、
TV_dfs その上。 によって指定された訪問の異なる順序 TV_rev, TV_postrev
& TV_prepostrev 類似のトラバーサルで指定されたものと同じです
TV_dfs, TV_postdfs & TV_prepostdfs.
TV_bfs : テレビタイプ_t
エッジを無視したグラフの幅優先探索を使用したグラフの走査
方向。 上のアイテムを参照してください TV_dfs 上記の役割について $ tvroot.
例
gvpr -i 'N [color == "blue"]' ファイル.gv
すべてのノードのノード誘導部分グラフを青色で生成します。
gvpr -c 'N [color == "blue"] {color = "赤"}' ファイル.gv
すべての青いノードを赤にします。
ベギン { int型 n, e; int型 tot_n = 0; int型 tot_e = 0; }
BEG_G {
n = nNodes($ G);
e = nEdges($ G);
printf ("%d ノード %d エッジ %s \ n "、 n, e, $ G.name);
tot_n += n;
tot_e += e;
}
終わり { printf ("%d ノード %d エッジ 合計\n"、 tot_n、 tot_e) }
プログラムのバージョン gc.
gvpr -c ""
に相当 NOP.
BEG_G { グラフ_t g = グラフ ("マージ"、 "S"); }
E {
ノードt h = clone(g、$。head);
ノードt t = clone(g、$。tail);
エッジ_t e = edge(t、h、 "");
e.重量 = e.重量 + 1;
}
END_G { $O = g; }
入力グラフの厳密なバージョンを生成します。ここで、エッジの重み属性
エッジが表す入力グラフからのエッジの数を示します。
ベギン {ノードt n; int型 deg []}
E {deg [head] ++; deg [tail] ++; }
END_G {
for (deg [n]) {
printf ("度[%s] = %d \ n "、 n.name、 deg [n]);
}
}
エッジのあるノードの次数を計算します。
ベギン {
int型 i, インデント;
int型 見た[文字列];
ボイド プリント (int cnt) {
for (i = 0; i < cnt; i ++) printf (" ");
}
}
BEG_G {
$ tvtype = TV_prepostfwd;
$ tvroot = node($、ARGV [0]);
}
N {
if (見た[$。name]) インデント - ;
ほかに {
prInd(インデント);
印刷 ($ .name);
見た[$。name] = 1;
インデント++;
}
}
名前がであるノードから始めて、グラフの深さ優先走査を印刷します
ARGV [0]、インデントされたリストとして。
ENVIRONMENT
GVPRPATH
によって指定されたファイルを見つけるために検索されるディレクトリのコロンで区切られたリスト
-fオプション。 gvpr デフォルトのリストが組み込まれています。 GVPRPATH 定義されていない、
デフォルトのリストが使用されます。 もしも GVPRPATH コロンで始まり、リストはによって形成されます
追記 GVPRPATH デフォルトのリストに。 もしも GVPRPATH コロンで終わり、リストは
デフォルトのリストをに追加することによって形成されます GVPRPATH。 さもないと、 GVPRPATH 使用され
リスト。
Windowsシステムでは、前の段落の「コロン」を「セミコロン」に置き換えます。
onworks.netサービスを使用してオンラインでgvprを使用する