英語フランス語スペイン語

Ad


OnWorksファビコン

yaccposix - クラウド上のオンライン

Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーター上の OnWorks 無料ホスティング プロバイダーで yaccposix を実行します。

これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド yaccposix です。

プログラム:

NAME


yacc — さらに別のコンパイラ コンパイラ (開発)

SYNOPSIS


ヤック [−dltv] [−b ファイルプレフィックス] [−p sym_prefix] 文法

DESCRIPTION


  ヤック ユーティリティは、文脈自由文法の記述を読み取る必要があります。 文法 そしてCを書きます
ISO C 標準に準拠したソース コードをコード ファイルに追加し、オプションでヘッダーを追加します。
情報を現在のディレクトリのヘッダー ファイルに保存します。 生成されたソースコードは、
以下の場合を除き、未定義、未指定、または実装定義の動作には依存しません。
提供された文法から直接コピーされた場合、または
実装によって文書化されます。 C コードは関数と関連ルーチンを定義します。
および、次の要件を満たす解析アルゴリズムを実行するオートマトン用のマクロ
アルゴリズム.

文法の形式と意味については、「拡張説明」セクションで説明されています。

C ソース コードとヘッダー ファイルは、C への入力として適切な形式で生成されます。
コンパイラ (参照 c99).

OPTIONS


  ヤック ユーティリティは、POSIX.1‐2008の基本定義ボリュームに準拠する必要があります。 セクション
12.2, ユーティリティ 構文 ガイドライン、ガイドライン9を除く。

次のオプションがサポートされます。

−b ファイルプレフィックス
  ファイルプレフィックス y すべての出力ファイル名のプレフィックスとして。 コード
file yタブc、ヘッダー ファイル yタブh (作成時 −d が指定されています)、そして
説明ファイル y.出力 (作成時 −v が指定されている)は、次のように変更されます。
ファイルプレフィックス.タブc, ファイルプレフィックス.tab.h, ファイルプレフィックス。出力それぞれ。

−d ヘッダー ファイルを書き込みます。 デフォルトでは、コード ファイルのみが書き込まれます。 の #定義する
ステートメントは、によって割り当てられたトークン コードを関連付けます。 ヤック ユーザーが宣言したものと
トークン名。 これにより、以下のソース ファイルが許可されます。 yタブc トークンにアクセスするには
コード。

−l 何も含まないコード ファイルを生成します。 #ライン 構築します。 このオプションの場合
が存在しない場合、コード ファイルまたはヘッダー ファイルに次のものが含まれるかどうかは不明です。
#ライン 指令。 これは文法と関連する文の後にのみ使用してください。
アクションは完全にデバッグされています。

−p sym_prefix
  sym_prefix yy によって生成されるすべての外部名の接頭辞として
ヤック。 影響を受ける名前には機能が含まれます。 yyパース()、 イレックス()、 と
yyエラー() と変数 イルヴァル, yychar, yyデバッグ。 (残りの部分では、
このセクションでは、引用されている XNUMX つのシンボルはデフォルト名を使用して参照されています。
表記上の便宜としてのみ使用されます。) ローカル名も影響を受ける可能性があります。 −p
オプション; しかし −p オプションは影響しません #定義する によって生成されたシンボル
ヤック.

−t デバッグのコンパイルを許可するように条件付きコンパイル ディレクティブを変更します。
コードファイル内のコード。 実行時デバッグステートメントは常に以下に含まれます。
コード ファイルですが、デフォルトでは条件付きコンパイル ディレクティブにより、
コンパイル。

−v パーサーの説明と競合のレポートを含むファイルを作成します。
文法の曖昧さによって生じたもの。

オペランド


次のオペランドが必要です。

文法 命令を含むファイルのパス名。以下、このように呼びます。 文法、用
パーサーが作成されるもの。 文法の形式については、
拡張説明セクション。

標準入力


使用されていない。

入力 ファイル


ファイル 文法 拡張説明で指定されているようにフォーマットされたテキスト ファイルでなければなりません
のセクションから無料でダウンロードできます。

ENVIRONMENT 変数


次の環境変数は、の実行に影響を与えます。 ヤック:

言語 設定されていない、または設定されていない国際化変数のデフォルト値を指定します
ヌル。 (POSIX.1‐2008の基本定義ボリュームを参照してください。 セクション 8.2,
国際化 Variables 国際化の優先順位について
ロケールカテゴリの値を決定するために使用される変数。)

LC_ALL 空でない文字列値に設定されている場合は、他のすべての値を上書きします
国際化変数。

LC_CTYPE テキストデータのバイトシーケンスを解釈するためのロケールを決定します
文字として(たとえば、のマルチバイト文字ではなくシングルバイト
引数と入力ファイル)。

LC_MESSAGES
の形式と内容に影響を与えるために使用する必要があるロケールを決定します
標準エラーに書き込まれる診断メッセージ。

NLSパス の処理のためのメッセージカタログの場所を決定します LC_MESSAGES.

  言語 & LC_ * 変数は実行に影響します。 ヤック 記載の通りのユーティリティ。 の メイン()
で定義された関数 ヤック 図書館 を呼び出します:

setlocale(LC_ALL, "")

したがって、によって生成されたプログラムは、 ヤック これらの内容によっても影響を受けることになります
実行時の変数。

非同期 イベント


デフォルト。

標準出力


使用されていない。

標準


シフト/リデュースまたはリデュース/リデュースの競合が検出された場合 文法, ヤック 書くもの
これらの競合を未指定の形式で標準エラーにレポートします。

標準エラーは診断メッセージにも使用されます。

出力 ファイル


コードファイル、ヘッダファイル、説明ファイルはテキストファイルとする。 全てです
以下のセクションで説明します。

Code File
このファイルには、 yyパース() 関数。 含まれるものとする
マクロ置換が実行されるさまざまなセマンティック アクションのコード
詳細については「拡張説明」セクションで説明されています。 また、そのコピーも含まれるものとします。 #定義する
ヘッダーファイル内のステートメント。 もし %連合 宣言が使用される場合、次の宣言が使用されます。
YYSTYPE もこのファイルに含まれます。

ヘッダ File
ヘッダー ファイルには次のものが含まれます。 #定義する トークン番号を
トークン名。 これにより、コード ファイル以外のソース ファイルがトークン コードにアクセスできるようになります。
もし %連合 宣言が使用される場合、YYSTYPE の宣言と 外部 YYSTYPE イルヴァル
宣言もこのファイルに含める必要があります。

説明 File
説明ファイルは、ステート マシンの説明を含むテキスト ファイルである必要があります。
パーサーに対応し、未指定の形式を使用します。 内部テーブルの制限 (「
境界) も実装定義の方法で報告されます。 (一部の実装では
動的割り当て技術を使用する場合があり、報告する特定の制限値はありません)。

拡張済み DESCRIPTION


  ヤック コマンドは、ターゲット言語の文法を定義するために使用される言語を受け入れます
によって生成されたテーブルとコードによって解析されます。 ヤック。 受け入れられる言語 ヤック として
ターゲット言語の文法は、以下を使用して説明されます。 ヤック 入力言語そのもの。

入力 文法 ターゲット言語の入力構造を記述するルールが含まれており、
これらのルールが関連するセマンティクスを提供すると認識されたときに呼び出されるコード
アクション。 実行されるコードは、C-C を意図したテキストの本文として表示されます。
言語コード。 これらの本文には、C 言語のトライグラフを含めてはなりません。 C言語
包含物は、によって処理されると正しい機能を形成すると推定されます。 ヤック その出力に
ファイル。 このように組み込まれたコードは、
目標とする言語。

文法を考えると、 ヤック ユーティリティは、出力ファイルで説明されているファイルを生成します。
セクション。 コード ファイルは次を使用してコンパイルおよびリンクできます。 c99。 宣言と
文法ファイルのプログラム セクションには、次の定義が含まれていませんでした。 メイン()、 イレックス()、 と
yyエラー()、コンパイルされた出力には、外部から提供されたバージョンとのリンクが必要です。
機能。 のデフォルトバージョン メイン()および yyエラー() は、 ヤック ライブラリと
を使用してリンクできます −l y オペランドへ c99を選択します。 ヤック ライブラリインターフェイスは必要ありません
デフォルト以外のインターフェースをサポート yy シンボルの接頭辞。 アプリケーションが提供するのは、
字句解析機能、 イレックス(); の LEX ユーティリティは特に次のように設計されています
このようなルーチンを生成します。

入力 言語設定
アプリケーションは、すべての仕様ファイルが次の XNUMX つのセクションで構成されていることを確認する必要があります。
注文: 宣言, 文法 ルール, プログラム、二重で区切ってください
文字 (「%%」)。 宣言セクションとプログラム セクションは空でもかまいません。 後者であれば
空、前の 「%%」 ルールセクションとの区切りマークは省略可能です。

入力は、以下に定義されている文法の構造に従った自由形式のテキストです。

語彙 Structure of   文法
の、 、 と文字は無視されます。
アプリケーションは、それらが名前や予約された複数文字に含まれていないことを確認する必要があります。
シンボル。 コメントは次のように囲みます。 "/* ... */"、名前がどこにでも表示されます
有効です。

名前は任意の長さで、文字とピリオド ('。')、アンダースコア(「_」)、及び
先頭以外の数字。 大文字と小文字は区別されます。 適合アプリケーション
で始まる名前を使用してはなりません yy or YY から ヤック パーサーはそのような名前を使用します。 たくさんの
名前は最終出力に表示されます。 ヤックしたがって、適合するように選択する必要があります
C コンパイラによって作成された追加ルールが使用される場合。 特に彼らが登場するのは、
in #定義する ステートメント。

リテラルは、一重引用符で囲まれた XNUMX つの文字で構成されます。 すべての
ISO C 標準によって文字定数に対してサポートされるエスケープ シーケンスは、次のとおりです。
による支援 ヤック.

字句アナライザーとの関係については、以下で詳しく説明します。

アプリケーションは、NUL 文字が文法規則で使用されていないことを保証する必要があります。
リテラル。

宣言 セクション
宣言セクションは、ターゲット言語の定義に使用されるシンボルを定義するために使用されます。
そして彼らのお互いの関係。 特に追加情報の多くは、
ターゲット言語の文脈自由文法のあいまいさを解決するために必要なのは、
ここに提供されます。

通常 ヤック 生成するシンボリック名とそのシンボリック名との関係を割り当てます。
基礎となる数値。 宣言セクションにより、
これらの値の割り当て。

現在のトークンに関連付けられたセマンティック情報を保持することもできます。
ユーザー定義の C 言語の解析スタック 組合、組合員が
文法内のさまざまな名前に関連付けられています。 宣言セクションでは次のように規定されています。
これも。

以下の宣言子の最初のグループはすべて、名前のリストを引数として受け取ります。 そのリストでできることは、
オプションで、C 共用体メンバー ( タグ 以下)登場
以内 '<' & '>'。 (この残りの部分の表記上の規則の例外として)
POSIX.1-2008 のボリューム (この場合)タグ> はメタ変数を表しませんが、
シンボルを囲むリテラルの山括弧文字。) タグ は、
この行で指定されたトークンは、によって参照される共用体メンバーと同じ C 型でなければなりません。
タグ。 これについては、以下でさらに詳しく説明します。

トークンの定義に使用されるリストの場合、特定のトークンの最初の出現の後に次のトークンが続きます。
正の整数 (XNUMX 進数の文字列として)。 これが行われると、基礎となる値は
語彙上の目的で割り当てられた番号は、その番号とみなされます。

以下は宣言します トークンになるには:

%トークン [<タグ>] [] [ []]...

If タグ が存在する場合、この行のすべてのトークンの C 型は、次の型として宣言されます。
によって参照される タグ。 正の整数の場合、 、に続きます 、その値は次のようになります
トークンに割り当てられます。

以下は宣言します をトークンにし、それに優先順位を割り当てます。

%左 [<タグ>] [] [ []]...
%右 [<タグ>] [] [ []]...

このセクションには、これらの記号のいずれかで始まる XNUMX 行以上の行が表示されます。
同じ行にあるすべてのトークンは、同じ優先レベルと結合性を持ちます。 台詞
優先順位または結合強度の高い順に並んでいます。 %左 は、
その行の演算子は左結合であり、 %右 同様に右を表します
結合演算子。 もしも タグ が存在する場合は、C 型を宣言します。 説明どおり
for %トークン.

以下は宣言します トークンであることを示し、これが使用できないことを示します
連想的に:

%nonassoc [<タグ>] [] [ []]...

パーサーは、このトークンの結合使用を検出すると、エラーを報告します。 もしも タグ is
存在する場合、C 型を宣言します。 について説明したとおり %トークン.

以下は、union メンバーを宣言します。 は非端末なので必須です
〜を持つ タグ 先頭のフィールド:

%タイプ <タグ> ...

非端末のみを扱うため、トークン番号を割り当てるかリテラルを使用することは困難です。
も禁止されています。 この構造体が存在する場合、 ヤック 型チェックを実行するものとします。 これなら
コンストラクトが存在しない場合、解析スタックは、 int型 タイプ。

で使用されているすべての名前 文法 によって定義されていない %トークン, %左, %右または %nonassoc
宣言は非終端記号を表すものとみなされます。 の ヤック 公益事業者は報告する必要がある
少なくとも XNUMX つの非終端記号の左側に表示されない非終端記号のエラー
文法規則。

名前のタイプ、優先順位、またはトークン番号が指定されると、それは指定されません。
かわった。 トークンの最初の宣言でトークン番号が割り当てられていない場合、 ヤック
トークン番号を割り当てます。 この割り当てが行われると、トークン番号は変更されません。
明示的な割り当てによって。

次の宣言子は、前のパターンに従いません。

以下は非終端を宣言します start シンボルを表す
文法規則によって記述される最大かつ最も一般的な構造:

%始める

デフォルトでは、これは最初の文法規則の左側です。 このデフォルトは次のとおりです
この宣言でオーバーライドされます。

以下は宣言します ヤック さまざまなタイプの値の結合となる値スタック
欲しい。

%連合 { ボディ of 組合 (in C)}

共用体の本体には、バランスの取れていない中括弧前処理トークンを含めてはなりません。

デフォルトでは、アクション (以下を参照) と字句アナライザーによって返される値は次のようになります。
タイプの int型を選択します。 ヤック ユーティリティは型を追跡し、対応するものを挿入します。
結果のパーサーの厳密な型チェックを実行するために、共用体メンバー名を使用します。

あるいは、少なくとも XNUMX つあると仮定すると、タグ> コンストラクトが使用されている場合、共用体を宣言できます
ヘッダー ファイル (ヘッダー ファイルは、 #include
内に構築する %{ & %})、および typedef 表すシンボル YYSTYPE を定義するために使用されます。
この組合。 の効果 %連合 YYSTYPE の宣言を直接提供することです。
  ヤック 入力。

C 言語の宣言と定義は、宣言セクションに記述できます。
次のマークで区切ってください。

%{ ... %}

これらのステートメントはコード ファイルにコピーされ、その中にグローバル スコープが含まれるため、
ルールやプログラムのセクションで使用できること。 ステートメントには次の内容を含めてはなりません
「%}」 コメント、文字列リテラル、または複数文字の定数の外側。

アプリケーションは、宣言セクションがトークンによって終了していることを確認する必要があります。 %%.

文法 キャンペーンのルール in ヤック
ルールセクションは、関数によって受け入れられる文脈自由文法を定義します。 ヤック
C 言語のアクションと追加の優先順位を生成し、それらのルールに関連付けます
情報。 文法を以下に説明し、正式な定義が続きます。

ルール セクションは XNUMX つ以上の文法ルールで構成されます。 文法規則の形式は次のとおりです。

A : BODY ;

象徴 A 非終端名を表し、 BODY ゼロのシーケンスを表すか、
他には? s, リテラルsであり、 セマンティック アクションs の後にオプションを続けることができます
優先順位 ルールs. 名前とリテラルのみが、
文法; セマンティック アクションと優先順位ルールは他の方法で使用されます。 のと
のそれは ヤック 句読点。 複数の連続した文法規則がある場合、
同じ左側、 ('|') の書き換えを避けるために使用できます。
左側; この場合、 は最後のルールの後にのみ表示されます。 身体
非終端であることを示すために、部分は空 (または名前とリテラルが空) にすることができます。
シンボルは空の文字列と一致します。

  ヤック ユーティリティは各ルールに一意の番号を割り当てます。 縦棒を使ったルール
表記法は別個のルールです。 ルールに割り当てられた番号が説明に表示されます
ファイルにソフトウェアを指定する必要があります。

BODY を構成する要素は次のとおりです。

, リテラル
これらは文法の規則を形成します。 どちらか トークン または 非ターミナル;
リテラル はそれ自体を表します (語彙的に必要な引用符は除きます)。

セマンティック アクション
ユーザーは文法規則ごとに、毎回実行するアクションを関連付けることができます。
ルールは入力プロセスで認識されます。 (「アクション」という単語は、
パーサーのアクション (シフト、リデュースなど) も指します。)

これらのアクションは値を返すことができ、以前のアクションによって返された値を取得することもできます。
行動。 これらの値は、タイプ YYSTYPE のオブジェクトに保持されます (「 %連合)。 ザ
アクションの結果値は、左側の解析スタックに保持されます。
ルールの側面。他のリダクションによって右側の一部としてアクセスされます。
側。 を使用することで、タグ> 宣言セクションで提供される情報、
によって生成されたコード ヤック 厳密に型チェックされ、任意の要素を含めることができます。
情報。 さらに、字句アナライザーは同じ種類の
必要に応じて、トークンの値。

アクションは任意の C ステートメントであり、入力または出力を行うことができます。
サブプログラムを作成し、外部変数を変更します。 アクションは XNUMX つ以上の C ステートメントです
中括弧で囲まれた '{' & '}'。 ステートメントには次の内容を含めてはなりません
アンバランスな中括弧の前処理トークン。

アクションでは特定の擬似変数を使用できます。 これらはアクセス用のマクロです
内部的に既知のデータ構造へ ヤック.

$$ アクションの値は、$$ に代入することで設定できます。 タイプの場合
チェックが有効になっており、割り当てる値の型を指定することはできません。
決定されると、診断メッセージが生成される場合があります。

$ これは、 で指定されたコンポーネントによって返される値を指します。
トークン ルールの右側では、左から右に読みます。
ゼロまたは負の値を指定できます。 もしも ゼロまたは負の場合、
パーサーのスタック上の名前に関連付けられたデータを指します
現在のルールの左端のシンボルの前にあります。 (あれは、 「$ 0」
の左端の名前の直前の名前を指します。
パーサーのスタック上で見つかる現在のルールと、 「$−1」 を参照
のシンボル その 左) 現在の要素を超えた要素を参照します
ルール内のポイント、またはスタックの最下位を超えると、結果は次のようになります。
未定義。 型チェックが有効で、値の型が
割り当てられているかを判断できない場合は、診断メッセージが生成される場合があります。

$<タグ>
これらは、対応するシンボルに正確に対応します。 タグ
包含されますが、厳密な型チェックが可能になります (そして、望ましくないものを排除します)
型変換)。 その結果、マクロは使用できるように拡張されます。 タグ
YYSTYPE 共用体から要素を選択するには (使用 データ名.タグ).
これは、次の場合に特に便利です。 はポジティブではありません。

$<タグ>$ これにより、参照される共用体メンバーの型が参照に強制されます。
by タグ。 この構造は、左側への参照の場合に適用されます。
コンテキスト値は文法内で発生し、以下を提供します ヤック 手段を使って
タイプを選択するためのものです。

アクションはルール内のどこにでも (最後だけでなく) 発生する可能性があります。 アクションでアクセスできるのは
アクションによって返される値はその左側にあり、返される値は次のようになります。
その右側のアクションからアクセスします。 ルールの途中にあるアクション
アクションを新しい非終端記号に置き換えることと同等であるものとし、
左側に非終端記号を含む空のルールを追加します。 の
新しいルールに関連付けられたセマンティック アクションは、元のルールと同等である必要があります。
アクション。 ルール内でアクションを使用すると、競合が発生する可能性があります。
それ以外の場合は存在します。

デフォルトでは、ルールの値はルール内の最初の要素の値になります。
最初の要素に型がない場合 (特に、
リテラル)、型チェックは次によってオンになります。 %タイプ、エラーメッセージが表示されます。

優先順位
キーワード %prec に関連付けられた優先レベルを変更するために使用できます。
特定の文法規則。 この例としては、単項と二項の場合があります。
演算子は同じ記号表現を持ちますが、異なるものを与える必要があります
優先順位、または曖昧な if-else 構造の処理がどこで行われるか
必要。 予約されたシンボル %prec の本文の直後に現れる可能性があります
文法規則の後にトークン名またはリテラルを続けることができます。 それはそうするだろう
文法規則の優先順位が次のトークンの優先順位になります。
名前またはリテラル。 ルール全体のアクションは次のようになります。 %prec.

プログラムセクションが続く場合、アプリケーションは文法規則が次のとおりであることを確認する必要があります。
によって終了 %%.

プログラム セクション
  プログラム セクションには字句アナライザーの定義を含めることができます イレックス()、および任意の
その他の機能。 たとえば、文法規則で指定されたアクションで使用されるものなどです。 それ
プログラム セクションがセマンティック アクションの前にあるのか、後ろにあるのかは未指定です。
出力ファイル。 したがって、アプリケーションにマクロ定義が含まれている場合、
セマンティックアクション内のコードに適用することを目的とした宣言は、それらを配置する必要があります
以内 "%{ ... %}" 宣言セクションで。

入力 文法
次の入力は、 ヤック 入力のパーサーを生成します。 ヤック。 この正式な構文
前述のテキスト構文の説明よりも優先されます。

語彙構造の定義はあまり正確ではありません。 語彙 Structure of   文法 定義
ほとんどの用語。 前項と以下のトークンの対応は以下の通りです。
続く。

識別子 これは、次の概念に対応します。 、以前に与えられました。 また、
前に定義したリテラル。

C_IDENTIFIER
これは名前であり、その後に次の文字が続くことがわかっています。 。 あ
リテラルはこのトークンを生成できません。

数字の文字列 (負ではない XNUMX 進整数)。

タイプ, LEFT, マーク, LCURL, RCURL
これらは直接に対応します %タイプ, %左, %%, %{, %}.

{ ... } これは C 言語のソース コードを示します。次のものが含まれる可能性があります。 '$'
マクロについては前述のとおりです。

/* 文法 for   〜へ やっ。 */
/* Basic エントリー。 */
/*   フォロー中   認識 by   語彙 アナライザ。 */

%token IDENTIFIER /* 識別子とリテラルが含まれます */
%token C_IDENTIFIER /* 識別子 (ただしリテラルではない)
続いて:。 */
%トークン番号 /* [0-9][0-9]* */

/* 予約語 : %type=>TYPE %left=>LEFT など */

%token LEFT RIGHT NONASSOC トークン PREC タイプ START UNION

%token MARK /* %% マーク。 */
%token LCURL /* %{ マーク。 */
%token RCURL /* %} マーク。 */

/* 8 ビット文字リテラルはそれ自体を表します。 */
/* マルチバイト文字にはトークンを定義する必要があります。 */

%開始仕様

%%

仕様 : defs MARK ルールの末尾
;
テール:マーク
{
/* このアクションでは、ファイルの残りの部分を設定します。 */
}
| /* 空; XNUMX 番目の MARK はオプションです。 */
;
defs : /* 空。 */
| デフデフ
;
def : 開始識別子
| 連合
{
/* ユニオン定義を出力にコピーします。 */
}
| LCURL
{
/* C コードを出力ファイルにコピーします。 */
}
RCURL
| rwordタグnlist
;
rword : トークン
| 左
| 右
| NONASSOC
| タイプ
;
tag : /* 空: ユニオンタグ ID はオプションです。 */
| '<' 識別子 '>'
;
nlist : nmno
| nlist nmno
;
nmno : IDENTIFIER /* 注: リテラルは % タイプでは無効です。 */
| IDENTIFIER NUMBER /* 注: % タイプでは無効です。 */
;

/* ルールセクション */

ルール: C_IDENTIFIER rbody prec
| ルール ルール
;
ルール: C_IDENTIFIER rbody prec
| '|' rbodyプレック
;
rbody : /* 空 */
| 本体識別子
| ボディアクト
;
活動 : '{'
{
/* アクションのコピー、$$ の変換など。 */
}
'}'
;
prec : /* 空 */
| プレック識別子
| PREC IDENTIFIER 法
| プレク ';'
;

競合
入力文法に対して生成されたパーサーには、競合が発生する状態が含まれる場合があります。 の
文法が正しくないために矛盾が発生する ラル(1)。 曖昧な文法には常に以下が含まれます
少なくても一つ ラル(1) 対立。 の ヤック ユーティリティは、次のいずれかを使用してすべての競合を解決します。
デフォルトのルールまたはユーザー指定の優先ルール。

競合は、競合のシフト/削減、または競合の削減/削減のいずれかです。 シフト/リダクション
競合とは、特定の状態と先読みシンボルに対して、シフト アクションと
軽減アクションが可能です。 Reduce/Reduce の競合は、特定の状態に対して、
先読みシンボルでは、XNUMX つの異なるルールによる削減が可能です。

以下のルールは、競合が発生したときに実行するアクションを指定する方法を説明します。 いいえ
すべてのシフト/リデュースの競合は、この方法で正常に解決できます。
曖昧さ以外の何かが原因であるため、これらの機能を不用意に使用すると、次のような問題が発生する可能性があります。
パーサーが受け入れた言語が、意図したものとは大きく異なる。 の
説明ファイルには、原因を理解するのに十分な情報が含まれている必要があります。
対立。 あいまいさが理由の場合は、デフォルトまたは明示的なルールを使用する必要があります。
動作するパーサーを作成するには十分です。

宣言された優先順位と結合性 (「 宣言 セクション) に慣れた
次のように解析の競合を解決します。

1. 優先順位と結合性は各文法規則に関連付けられています。 それは
ルール本体内の最後のトークンまたはリテラルの優先順位と結合性。 もしも
  %prec キーワードが使用されると、このデフォルトはオーバーライドされます。 一部の文法規則はそうでない場合があります
優先順位と結合性の両方を持ちます。

2. Shift/Reduce の競合があり、文法規則と入力記号の両方が一致しない場合
優先順位と結合性が関連付けられている場合、競合は解決されます。
より高い優先順位に関連付けられたアクション (シフトまたは削減) を優先します。 もし
優先順位が同じ場合、結合性が使用されます。 左結合の意味
縮小、右結合はシフトを意味し、非結合はエラーを意味します。
解析中の文字列。

3. ルール 2 で解決できないシフト/リデュース競合がある場合、シフトは
終わり。 この方法で解決された競合は、「」で説明されている診断出力でカウントされます。
エラー ハンドリング.

4. Reduce/Reduce の競合がある場合、次の文法規則に従ってリダクションが行われます。
入力シーケンスの前半で発生します。 この方法で解決された競合は、
で説明されている診断出力 エラー ハンドリング.

優先順位または結合性によって解決された競合は、shift/reduce ではカウントされません。
報告された競合を削減/軽減します ヤック 標準エラーまたは
説明ファイル。

エラー ハンドリング
トークン エラー エラー処理用に予約されます。 名前 エラー で使用できます
文法規則。 これは、パーサーが構文エラーから回復できる場所を示します。 の
のデフォルト値 エラー 値は 256 になります。その値は、 %トークン 宣言。
字句アナライザーは次の値を返してはなりません。 エラー.

パーサーは、アクションが関連付けられた状態にあるときに構文エラーを検出します。
先読み記号が付いているのは エラー。 セマンティック アクションにより、パーサーが開始される可能性があります。
マクロ YYERROR を実行することによるエラー処理。 YYERROR が実行されると、セマンティクスは
アクションは制御をパーサーに戻します。 YYERROR はセマンティック以外では使用できません
行動。

パーサーが構文エラーを検出すると、通常は次の呼び出しが行われます。 yyエラー() 文字付き
文字列 "構文 エラー" その引数として。 パーサーがまだ動作していない場合、呼び出しは行われません。
エラーが検出された場合は、以前のエラーから回復します。 パーサーは次のように考えられます
パーサーが少なくとも XNUMX 回以上シフトするまで、前のエラーから回復する
最後のエラーが検出されたか、セマンティック アクションが実行されてからの通常の入力記号
マクロ イェロク。 パーサーは呼び出しません yyエラーYYERROR実行時は()。

マクロ関数 YYRECOVERING は、構文エラーが検出された場合に 1 を返し、
パーサーはまだ完全に回復していません。 それ以外の場合は、ゼロが返されます。

構文エラーがパーサーによって検出されると、パーサーは以前の構文が正しいかどうかを確認します。
エラーが検出されました。 以前のエラーが検出され、正常な入力記号がない場合
前のエラーが検出されてからシフトされている場合、パーサーは、
先読み記号はエンドマーカーです (「 インタフェース 〜へ   語彙 アナライザ)。 そうであれば、
パーサーはゼロ以外の値を返します。 それ以外の場合、先読み記号は次のようになります。
破棄され、通常の解析が再開されます。

YYERROR が実行されたとき、またはパーサーが構文エラーを検出したが以前のエラーが検出されなかったとき
が検出されたか、少なくとも XNUMX つの通常の入力シンボルが前回の入力シンボルからシフトされています。
エラーが検出された場合、パーサーは解析スタックが完了するまで、一度に XNUMX つの状態をポップバックします。
空、または現在の状態でシフトオーバーが可能 エラー。 パーサーが解析を空にした場合
スタックの場合、ゼロ以外の値が返されます。 そうしないと、シフトしてしまいます エラー &
その後、通常の解析を再開します。 パーサーがエラーが発生する前に先読みシンボルを読み取った場合
検出された場合でも、そのシンボルは解析が再開されたときに引き続き先読みシンボルとなります。

マクロ イェロク セマンティック アクションでは、パーサーが完全に実行されたかのように動作します。
以前のエラーから回復しました。 マクロ yyクリアリン パーサーが破棄するようにします
現在の先読みトークン。 現在の先読みトークンがまだ読み取られていない場合は、
yyクリアリン は影響を及ぼさないものとします。

マクロ YYACCEPT を使用すると、パーサーは値 XNUMX を返します。 マクロ YYABORT
パーサーはゼロ以外の値を返します。

インタフェース 〜へ   語彙 アナライザ
  イレックス() 関数は、整数値を返す関数です。 トークン
読み取られたトークンの種類を表します。 トークンに関連付けられた値がある場合
によって返される イレックス() (の議論を参照 タグ 上記)、に割り当てられるものとします。
外部変数 イルヴァル.

パーサーと イレックス() これらのトークン番号に同意しない場合、信頼性の高い通信が行われます
それらの間には発生しません。 (シングルバイト文字) リテラルの場合、トークンは単に
現在の文字セット内の文字の数値。 他のトークンの番号
どちらかを選択できます ヤック、またはユーザーが選択します。 いずれの場合も、 #定義する 構築する
C のを使用して許可します イレックス() を使用して、これらの数値を記号的に返します。 の #定義する
はコード ファイルに挿入され、そのファイルが要求された場合はヘッダー ファイルにも挿入されます。 のセット
によって許可された文字 ヤック 識別子の値が C で許可されているものより大きいです。トークン
そのような文字が含まれていることが判明した名前は、 #定義する 宣言。

トークン番号が次のように選択された場合 ヤック、リテラル以外のトークンが割り当てられます。
256 より大きい数値。ただし、順序は暗示されません。 トークンは明示的に割り当てることができます
宣言セクションで最初に出現した後に数字を続けることで、数字を取得できます。
この方法で定義されていない名前とリテラルは、デフォルトの定義を保持します。 すべてのトークン番号
によって割り当てられた ヤック 一意であり、リテラルに使用されるトークン番号とは異なるものでなければなりません。
ユーザーが割り当てたトークン。 重複したトークン番号によりパーサーの生成で競合が発生する場合、
ヤック エラーを報告するものとします。 それ以外の場合、トークンの割り当てが行われるかどうかは不特定です。
受け入れられるか、エラーが報告されます。

入力の終わりは、 エンドマーカー、トークンを持っています
ゼロまたは負の数値。 (これらの値は、他のトークンに対しては無効です。) すべて
字句解析器は、末尾に到達するとトークン番号としてゼロまたは負の値を返すものとします。
彼らの意見。 エンドマーカーまでのトークンがエンドマーカーを除いた構造を形成する場合、
開始記号と一致する場合、パーサーは入力を受け入れます。 エンドマーカーが表示されている場合
他のコンテキストでは、エラーとみなされます。

完了   演奏曲目
に加えて yyパース()および イレックス()内の関数 yyエラー()および メイン() は必須です
完全なプログラムを作成します。 アプリケーションが提供できるのは、 メイン()および yyエラー()、またはそれら
ルーチンは次から取得できます。 ヤック としょうかん。

ヤック 図書館
次の関数は、 ヤック からアクセスできるライブラリ −l y
オペランドへ c99; したがって、適合するアプリケーションによって再定義できます。

int型 メイン(ボイド)
この関数は呼び出す必要があります yyパース() を実行し、値を指定せずに終了します。 その他のアクション
この関数内では未指定です。

int型 yyエラー(定数 チャリオット *s)
この関数は、NUL で終了する引数を標準エラーに書き込み、その後にそれを書き込みます。
ある。

の順序 −l y & −l l に与えられるオペランド c99 重要です。 アプリケーションは、
独自のものを提供するか、 メイン() が機能するか、それを保証する −l y 先行 −l l.

デバッギング   パーサ
によって生成されたパーサー ヤック オプションで診断機能を備えているものとします。
コンパイル時または実行時のいずれかで有効になります (コンパイル時に有効な場合)。 の
ランタイム デバッグ コードのコンパイルは、プリプロセッサである YYDEBUG の制御下にあります。
シンボル。 YYDEBUG がゼロ以外の値を持つ場合、デバッグ コードが含まれます。 もし
値がゼロの場合、コードは含まれません。

デバッグ コードが含まれているパーサーでは、外部 int型 yyデバッグ することができます
実行時にデバッグをオン (ゼロ以外の値) またはオフ (ゼロ値) にするために使用されます。 の
の初期値 yyデバッグ はゼロになります。

日時 −t YYDEBUG がまだ指定されていない場合、コード ファイルは次のように構築されます。
コンパイル時に定義されます ( c99 −d たとえば、YYDEBUG オプション)、YYDEBUG は
明示的に 1 に設定する必要があります。 −t が指定されていない場合、コード ファイルは次のように構築されます。
YYDEBUG がまだ定義されていない場合は、明示的にゼロに設定されます。

デバッグ出力の形式は指定されていませんが、少なくとも十分な情報が含まれています
シフトとリデュースのアクション、および入力記号を決定します。 また、
エラー回復に関する情報。

アルゴリズム
によって構築されたパーサー ヤック を実装します ラル(1) に記載されている解析アルゴリズム
文学。 パーサーがテーブル駆動であるか直接コーディングであるかは未指定です。

によって生成されたパーサー ヤック からの入力シンボルを要求することはありません イレックス() にいる間
エラーアクション以外のアクションのみが単一のルールによる削減である状態。

解析理論の文献では、これらの概念が定義されています。

境界
  ヤック ユーティリティには複数の内部テーブルがある場合があります。 これらのテーブルの最小最大値
以下の表に示します。 これらの値の正確な意味は実装です。
定義されています。 実装では、これらの値の間の関係と、値間の関係を定義します。
これらと、不足した場合に実装によって生成される可能性のあるエラー メッセージ
内部構造のためのスペース。 実装では、これらのリソースのグループを組み合わせることができます
ユーザーが利用できる合計が合計を下回らない限り、単一のプールに分割されます。
このセクションで指定されたサイズの。

表: 内部 境界 in ヤック

┌───────┬─────┬─────────── ───┐
││ 最小 ││
リミット最大説明
§───────┼─────┼─────────── ────┤
│{NTERMS} │ 126 │ トークンの数。 │
│{NNONTERM} │ 200 │ 非端末の数。 │
│{NPROD} │ 300 │ ルールの数。 │
│{NSTATES} │ 600 │ 状態の数。 │
│{MEMSIZE} │ 5200 │ ルールの長さ。 合計 │
│ │ │ 名前内の長さ (トークンと │
│ │ │ 非端末)、すべての │
│ │ │ 文法の規則。 │
│ │ │ 左辺をカウントします │
│ │ │ それぞれのルール、そうでない場合でも │
│ │ │ のように、明示的に繰り返されます。
│ │ │ で指定 文法 キャンペーンのルール in
│││ ヤック。 │
│{ACTSIZE} │ 4000 │ アクションの数。 「アクション」 │
│ │ │ ここ (および説明文 │
│ │ │ ファイル)パーサーアクションを参照 │
│ │ │ (シフト、縮小など) ではありません │
│ │ │ で定義された意味アクションへ
│││ 文法 キャンペーンのルール in ヤック。 │
━───────┴─────┴─────────── ────┘

EXIT ステータス


次の終了値が返されます。

0正常に完了しました。

> 0エラーが発生しました。

結果 OF エラー


エラーが発生した場合、実行は中止され、 ヤック ゼロ以外のステータスで終了します。
部分的なコード ファイルとヘッダー ファイルが生成される場合があります。 の概要情報は、
記述ファイルは、次の場合に常に生成されます。 −v フラグが存在します。

  フォロー中 セクション   有益です。

お申込み USAGE


これまでの実装では、名前の競合が発生していました。 yacc.tmp, yacc.acts,
yacc.デバッグ, yタブc, yタブh, y.出力 複数のコピーがある場合 ヤック で走っています
一度に単一のディレクトリ。 の −b この問題を解決するためにオプションが追加されました。 の
複数の許可に関連する問題 ヤック 同じファイルに配置されるパーサーは
を追加することで対処します −p 以前にハードコーディングされたものをオーバーライドするオプション yy 変数プレフィックス。

の説明 −p オプションは関数名と変数名の最小限のセットを指定します
複数のパーサーがリンクされると競合が発生します。 YYSTYPE は必須ではありません
かわった。 代わりに、プログラマは次を使用できます。 −b さまざまなパーサーにヘッダー ファイルを提供する
別の名前を付けてから、 イレックス特定のパーサーの () には、
そのパーサーのヘッダー。 などの名前 yyクリアラー 変更する必要はありません。
アクション内でのみ使用されます。 それらにはつながりがありません。 可能性があります。
実装には別の名前があり、次のようなものを実装するための内部的な名前です。
yyクリアラー、または変更を希望する非標準機能を提供する −p.

一般に、二項演算子と同じトークンである単項演算子には、
優先順位が調整されました。 これを処理するのは、 %prec に関連付けられた勧告シンボル
その単項演算子を定義する特定の文法規則。 (見る 文法 キャンペーンのルール in ヤック.)
アプリケーションは単項演算子にこの演算子を使用する必要はありませんが、文法
それを必要としないことはまれです。


のアクセス ヤック ライブラリは、ライブラリ検索オペランドを使用して取得されます。 c99。 を使用するには
ヤック ライブラリ メイン():

c99 yタブc −l y

両方の LEX 図書館と ヤック ライブラリに含まれる メイン()。 にアクセスするには、 ヤック メイン():

c99 yタブc lex.yy.c −l y −l l

これにより、 ヤック ライブラリが最初に検索されるため、 メイン() 使用されている。

歴史的な ヤック ライブラリには、通常コーディングされる XNUMX つの単純な関数が含まれています
アプリケーションプログラマーによる。 これらの関数は次のコードに似ています。

#include
int型 メイン(ボイド)
{
外部 int型 yyparse();

setlocale(LC_ALL, "");

/* 次のパーサーが lex によって作成されたパーサーである場合、
アプリケーションは LC_CTYPE を確認するように注意する必要があります。
および LC_COLLATE は POSIX ロケールに設定されます。 */
(void) yyparse();
戻り値(0);
}

#include

int yyerror(const char *msg)
{
(void) fprintf(stderr, "%s\n", msg);
戻り値(0);
}

理論的根拠


の参考文献 参照された 資料 パーサーの構築に役立つ可能性があります
発生器。 参照された DeRemer と Pennello の記事 (およびその作品)
参考文献) では、このボリュームに準拠するパーサーを生成する手法について説明しています。
POSIX.1‐2008。 この分野の作業は引き続き行われるため、実装者は相談する必要があります。
新しい実装を行う前に、現在の文献を参照してください。 Knuth の元の記事は次のとおりです。
この種のパーサーの理論的基礎はありますが、生成されるテーブルは非現実的です。
妥当な文法では大きいため、使用しないでください。 「同等」という文言は、
最適なテーブルを保証することを意図しています。 ラル(1)を生成することができます。

文法のクラスと、文法を生成するために必要なアルゴリズムの間に混乱がありました。
パーサー、および言語を解析するために必要なアルゴリズム。 それらはすべて合理的です
直交する。 特に、全範囲を受け入れるパーサー ジェネレーター LR(1)
文法は、受け入れ可能なテーブルよりも複雑なテーブルを生成する必要はありません。 一眼レフ(1) (a
比較的弱いクラスの LR 文法) 一眼レフ(1)。 そんな
実装でもケースを認識する必要はありません。 テーブル圧縮により、 一眼レフ(1)
文法が次であることを認識せずにテーブル (またはそれよりも小さいテーブル) 一眼レフ(1) の
の速度 LR(1) どのクラスのパーサーもテーブル表現に大きく依存しており、
クラスよりも圧縮 (直接パーサーが生成される場合はコード生成)
テーブルジェネレーターが処理する文法の種類。

パーサー ジェネレーターの速度は、パーサー ジェネレーターの文法のクラスに多少依存します。
ハンドル。 ただし、LR パーサーを構築するための元の Knuth 記事のアルゴリズムは、
その時点では非現実的に遅いと作者によって判断されました。 フルLRの方が多いですが
よりも複雑な ラル(1) コンピュータの速度とアルゴリズムが向上するにつれて、その違い (用語の意味)
許容可能な実時間の実行時間) は重要ではなくなりつつあります。

著者になる可能性のある人は、参照されている DeRemer と Pennello の記事について注意してください。
前述のバグ (計算の過度の単純化) が特定されています。 ラル(1)
先読みセット) の一部では、 ラル(1) その前にあるアルゴリズム ステートメント
出版物。 時間をかけてその論文や現在の関連文書を探す必要があります。
仕事、特にアホの仕事。

  −b 許可するためのポータブルな方法を提供するオプションが追加されました。 ヤック 働く
同じディレクトリ内の複数の個別のパーサー。 ディレクトリに複数のファイルが含まれている場合
ヤック 両方の文法が同時に構築されます (たとえば、
パラレル make プログラム)、競合の結果。 解決策は歴史的な慣例ではありませんが、
これにより、過去の実装における既知の欠陥が修正されます。 対応する変更は次のとおりです。
ファイル名を参照したすべてのセクションに対して行われます yタブc (現在は「コード ファイル」)、
yタブh (現在は「ヘッダー ファイル」)、そして y.出力 (現在は「説明ファイル」)。

の文法 ヤック 入力は System V のドキュメントに基づいています。 テキストによる説明
そこに、 ';' ルールの最後に必須です。 文法と
実装ではこれは必要ありません。 (の用法 C_IDENTIFIER の減少を引き起こします
正しい場所です。)

また、その実装では、次のような構成要素が使用されます。 %トークン によって終了できます
, しかし、これは文法上許可されていません。 といったキーワードが %トークン できる
大文字でも表示されますが、これについても説明しません。 ほとんどの場所では、 '%' 使用されている、
置き換えることができ、一部の記号には別のスペルがあります
(例えば、 %左 することができます 「%<」 あるいは 「\<」).

歴史的には、タグ> を除く任意の文字を含めることができます。 '>'、空白を含む、
実装。 ただし、以来、 タグ ISO C 標準共用体メンバーを参照する必要があります。
実務に準拠した実装では、ISO C の文字セットのみをサポートする必要があります。
このコンテキストでは標準識別子です。

一部の歴史的な実装は、
期間。 これまでの実装では、多くの場合、 '$' 名前で。 準拠した実装
これらの動作のいずれかをサポートする必要はありません。

いつ使用するかを決める %prec の動作を指定することの難しさを示しています。 ヤック.
状況が発生する可能性があります。 文法 厳密に言えば間違いではありませんが、
ヤック 一義的に解釈することはできません。 文法のあいまいさを解決するには、
多くの場合、次のような追加情報を提供することで解決できます。 %タイプ or
%連合 宣言。 多くの場合、この方が簡単で、通常は取得するパーサーが小さくなります。
適切な場合は、この代替案を使用してください。

ランタイム デバッグ コードを使用せずに生成されたプログラムのサイズと実行時間は次のとおりです。
従来の実装では通常は小さく、わずかに高速でした。

いくつかの歴史的な実装からの統計メッセージには、次のタイプが含まれます。
情報:

n/512端子、 n/300 非端末
n/600の文法規則、 n/1500州
n シフト/リダクション、 n 報告された競合を減らす/減らす
n/350 のワーキング セットを使用
メモリ: 状態など n/15000、パーサー n/ 15000
n/600 の個別の先読みセット
n 追加のクロージャ
n シフトエントリー、 n 例外
n エントリに移動
n デフォルトで goto によって保存されたエントリ
使用されるオプティマイザー空間: 入力 n/15000、出力 n/ 15000
n テーブルエントリ、 n ゼロ
最大スプレッド: n、最大オフセット: n

記述ファイル内の内部テーブルのレポートは実装定義のままです。
これらの制限のすべての側面も実装によって定義されるためです。 いくつかの実装
動的割り当て技術を使用する場合があり、レポートする特定の制限値がありません。

のフォーマット y.出力 形式の指定がなかったため、ファイルは指定されませんでした
アプリケーションの移植性が向上すると考えられます。 このリストは主に人間を助けることを目的としています。
ユーザーはパーサーを理解し、デバッグします。 の使用 y.出力 適合したアプリケーションスクリプトによる
珍しいでしょう。 さらに、実装では一貫した出力が生成されておらず、
人気のフォーマットが明らかになりました。 実装によって選択される形式は人間によるものである必要があります。
テキスト ファイルであるという要件に加えて、読み取り可能である必要があります。

標準エラー レポートは、次の目的で使用されることはほとんどないため、特に説明されていません。
準拠したアプリケーションであり、実装を制限する理由はありませんでした。

一部の実装では認識します 「={」 と同等 '{' 歴史に登場するから
ドキュメンテーション。 この構造ははるか昔に時代遅れであると認識され文書化されていました。
1978 年、参考文献 ヤック: まだ 別の コンパイラ-コンパイラ。 POSIX.1-2008 の本書
それを時代遅れとして残し、省略することにしました。

マルチバイト文字は字句アナライザーによって認識され、トークンとして返される必要があります。
これらはマルチバイト文字リテラルとして返されるべきではありません。 トークン エラー それは使われています
従来の実装では、エラー回復には通常、値 256 が割り当てられます。
したがって、多くのマルチバイト文字セットで使用されるトークン値 256 は、
ユーザー定義トークンの値として使用できます。

未来 道順


なし。

onworks.net サービスを使用してオンラインで yaccposix を使用する


無料のサーバーとワークステーション

Windows と Linux のアプリをダウンロード

Linuxコマンド

Ad