これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド btyacc です。
プログラム:
NAME
btyacc — ラル(1) バックトラッキングをサポートするパーサー ジェネレーター
SYNOPSIS
btyacc [-NS 接頭辞] [-d] [-DNAME ...] [-E] [-l] [-r] [-S x.スケ] [-t] [-v]
ファイル名.y
説明
btyacc は byacc (Berkeley YACC) の修正バージョンであり、パブリック ドメインです。
オリジナルの AT&T YACC パーサー ジェネレーターのバージョン。
btyacc はファイル内の文法仕様を読み取ります。 ファイル名.y そして、 LR(1)
それのためのパーサー。 パーサーは次のセットで構成されます。 ラル(1) 解析テーブルとドライバルーチン
C プログラミング言語で書かれています。 btyacc は通常、解析テーブルと
ファイルへのドライバー ルーチン 接頭辞.タブcここで、 接頭辞 デフォルトは「y」です。
文法仕様の形式の詳細な説明と、優れた
YACC のようなツールの使用方法に関するチュートリアル。GNU の情報マニュアルを参照してください。 バイソン。 btyacc-
特定の拡張機能については以下で説明します。
ご注意: btyacc の上流の作成者によって提供されるパーサー スケルトンは、C++ としてのみコンパイルされます。 使用
スケルトン /usr/doc/btyacc/examples/btyacc-c.ske 両方をコンパイルするパーサーを生成するには
C および C++ として。 (残念ながら、この代替スケルトンは現在 malloc() をチェックしません
値を返します。)
オプション
-b 接頭辞 出力ファイル名の先頭に付加されるプレフィックスを、 で示される文字列に変更します。
接頭辞。 デフォルトの接頭辞は文字「y」です。
-d というヘッダー ファイルを作成します。 接頭辞.tab.h と一緒に 接頭辞.タブc,
シンボル定義と宣言が含まれています。 YYSTYPE と イルヴァル.
-DNAME btyacc プリプロセッサ変数を定義する NAME、一緒に使用します %ifdef NAME
文法ファイル内のディレクティブ。
-E 前処理された文法を標準出力に出力します。
-l 挿入しない #ライン 生成されたパーサー コードにディレクティブを追加します。
-r パーサー コードと関連テーブルを別のファイルに書き込みます。 一方、
テーブルは次の場所にあります 接頭辞.タブc 前と同様に、コードが記述されます
〜へ 接頭辞.code.c.
-S x.スケ 別のパーサー スケルトンを選択します。 デフォルトのスケルトンは、
プログラムですが、ファイル内にコピーが見つかります btyaccpa.ske.
-t デバッグ コードを生成されたパーサーにコンパイルします。
-v 生成されたパーサーの人間が読める形式の説明を次の場所に書き込みます。 y.出力。 それ
パーサーの状態、先読みトークンのアクション、およびその他の情報が含まれます。
衝突します。
BTYACC エクステンション
バックトラッキング サポート
btyacc で生成されたパーサーで、shift-reduce または reduce-reduce エラーが発生するたびに、
解析テーブルでは、現在の解析ポイント (スタックと入力ストリームの状態) を記憶し、
トライアル解析モードに入ります。 その後、ほとんどのルール アクションを無視して解析を続行します。 走れば
(解析テーブルまたはアクション呼び出しを通じて) エラーになります。 YYエラー)、 それ
最新の競合ポイントまで後戻りし、別の代替案を試みます。 それであれば
成功したパスを見つけます (入力の終わりに到達するか、アクション呼び出しが行われます) YY有効)、 それ
最初にトライアル解析モードに入った時点まで戻り、完全な解析モードを続行します。
成功したトライアルのパスに従い、解析 (すべてのアクションを実行)。
btyacc のアクションには XNUMX つの種類があります。 {} アクションは、そうでない場合にのみ実行されます。
トライアルモードと [] モードに関係なく実行されるアクション。
例: C の YACC 文法では、「レクサー フィードバック ハック」として知られる標準的なハックは次のとおりです。
typedef 名を検索するために使用されます。 レクサーは意味情報を使用して、指定されたものがあるかどうかを判断します。
identifier は typedef 名であるかどうかにかかわらず、特別なトークンを返します。 btyacc を使用すると、いいえ
これを行う必要がなくなりました。 レクサーは常に識別子を返す必要があります。 btyacc
文法には次の形式のルールが必要です。
タイプ名: ID [ if (!IsTypeName(LookupId($1))) YYエラー; ]
ただし、バックトラッキング ルールを追加すると、パーサーの速度が低下することに注意してください。 実際には、あなたは
文法上の矛盾の数を絶対に制限すべきものに制限する必要があります。
必要。 クリーンなソリューションである場合は、「レクサー フィードバック ハック」の使用を検討してください。
いくつかの特別な場合のためにバックトラッキングを予約します。
btyacc は、「最初にシフトしてから、順番に減らしてみる」というルールを使用してトライアルを実行します。
競合するルールが入力ファイルに表示されることを示します。これは、実装できることを意味します。
意味上の曖昧さ回避ルールは次のとおりです: (1) 宣言のように見える場合、それは宣言です。
それ以外の場合 (2) 式のように見える場合はそのとおりです。そうでない場合は (3) 構文エラーです。
[Ellis & Stroustrup、注釈付き C++ リファレンス マニュアル、p93]。 これを達成するには、すべてを入れます
文法ファイル内の式のルールの前に宣言のルールを追加します。
バックトラッキングは、解析がshift/reduceまたはreduce/reduceにヒットした場合にのみトリガーされます。
テーブル内の競合。 文法に矛盾がなければ、追加料金はかかりません。
決して呼び出されない追加のコードを除いて。
現在、生成されたパーサーは次のことを実行します。 いいえ 代替解析パスの枝刈り。 避けるために
可能なパス (および解析時間) が指数関数的に爆発的に増加するため、手動で通知する必要があります。
パーサーは、保存されたパスを破棄できる場合に、 YY有効 声明。 で
実践してみると、これは非常に簡単に実行できることがわかります。 たとえば、C++ パーサーは次のことを行うことができます。
含む [YY有効;] 完全な宣言とステートメントのルールが完了するたびに、その結果、
`;' を見た後、バックトラッキング状態がプルーニングされています。 または `}' - 決して存在しません
このような状況では、これらのいずれかを過去に遡ることが有益です。
改善されました トークン 位置 取り扱い
コンパイラーは多くの場合、ツリー内のすべてのノードが
解析されたプログラム ソースに関連付けることができます。 の YYPOSN サポートされているメカニズム
btyacc のツールは、テキスト位置の計算を自動化し、
計算されたテキストの位置を AST ノードに送信します。
標準の YACC では、すべてのトークンとすべての非端末には YYSTYPE 意味値
それに付属しています。 btyacc では、すべてのトークンとすべての非端末にも、 YYPOSN 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다.
それに付随する位置。 YYPOSN ユーザー定義型です。
btyacc は、スタックを維持するのと同じ方法でテキスト位置値のスタックを維持します。
意味値の。 テキスト位置機能を利用するには、次のことが必要です。 #定義する
次のとおりです。
YYPOSN すべてのテキスト位置に付加される C/C++ タイプのプリプロセッサ シンボル。
トークンと非終端。
yyposn 型のグローバル変数 YYPOSN。 レクサーは、テキストの位置を割り当てる必要があります。
のセマンティック値を割り当てるのと同じように、トークンを yyposn に返します。
トークンを yylval に返しました。
YYREDUCEPOSNFUNC
通常の関数の直後に呼び出される関数のプリプロセッサ シンボル
文法規則の削減が実行され、上にあるテキストの位置が削減されました。
スタック
通常、この関数は右側のルールからテキスト位置を抽出します。
コンポーネントを取得し、それらを返された $$ 構造/ツリーに割り当てるか、そうでない場合は割り当てます。
$$ 値が返され、それを ret テキストの位置に置きます。
後で他のルールによって取り上げられます。 そのプロトタイプは次のとおりです。
ボイド 位置を減らす(
YYPOSN& RET,
YYPOSN* term_posns,
YYSタイプ* term_vals,
int型 期間番号,
int型 stk_pos,
int型 yychar,
YYPOSN& イポスン,
ユーザータイプ 余分な);
ret ルールによって返されるテキスト位置への参照。 上書きする必要があります
これに、ルールによって得られる計算されたテキスト位置を使用します。これは次のようになります。
$$ セマンティック値。
term_posns
右側のルールコンポーネントの配列 YYPOSN テキストの位置、
意味値の $1、$2、...、$N に似ています。
term_vals 右側のルールコンポーネントの配列 YYSTYPE 価値観。 これらは
$1、...、$N 自体。
term_no 縮小されたルールの右側のコンポーネントの数。
term_posns 配列と term_vals 配列のサイズ。 $1, ..., の N にも等しい
$N。
stk_pos YYSTYPE/YYPOSN 縮小前のスタック位置。
yychar 縮小された右側の直後に続く先読みトークン
コンポーネント。
イポスン YYPOSN 縮小された右側の直後にあるトークンの
コンポーネント。
extra ReducePosn に渡されるユーザー定義の追加引数。
YYREDUCEPOSNFUNCARG
ReducePosn 関数に渡される追加の引数。 この引数は任意のものにすることができます
で定義された変数 btyaccpa.ske.
Next 割り当て解除 間に エラー 回復
ほとんどの YACC 風のパーサー ジェネレーターの場合、生成されたパーサーのアクションは、
解析エラーは、次のルールが含まれるまでセマンティック値を破棄し、トークンを入力することです。
特別な非端末 エラー 合わせることができます。 トークンの破棄は単純に次のように実行されます。
型の変数と配列エントリを上書きする YYSTYPE 新しい価値観で。
残念ながら、このアプローチは次の場合にメモリ リークを引き起こします。 YYSTYPE ポインタ型です。 btyacc
を使用すると、セマンティック値とテキスト位置の値をクリーンアップするための関数を提供できます。
#定義する文法ファイルのプリアンブルに次の記号を追加します。
YYDELETEVAL
トークンのセマンティック値の前に呼び出す関数のプリプロセッサ シンボル
または非終端は破棄されます。
イデレテポソン
トークンのテキスト位置の前に呼び出す関数のプリプロセッサ シンボル
または非終端は破棄されます。
どちらの関数も XNUMX つの引数を指定して呼び出されます。 type の最初の引数 YYSTYPE or YYPOSN
は破棄される値です。 XNUMX 番目の引数の型は int型 のXNUMXつです
XNUMX つの値:
0 入力トークンを破棄します
スタック上の 1 つの状態を破棄
2 アボート時のスタックのクリーンアップ
詳細 構文 エラー 報告
もしあなた #定義する プリプロセッサ変数 YYERROR_DETAILED 文法ファイルでは、次のようにする必要があります。
次のエラー処理関数も定義します。
ボイド yyerror_詳細(
char * 클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다. ,
int型 エラー,
YYSTYPE&
errt_value,
YYPOSN& errt_posn);
テキストエラーメッセージ
エラーの原因となったトークンの errt コード
errt_value
エラーの原因となったトークンの値
errt_posn エラーの原因となったトークンのテキスト位置
プリプロセッサ ディレクティブ
btyacc は、シンボルの定義と、内部の条件付きディレクティブを使用したシンボルへの作用をサポートします。
C プリプロセッサと同様の文法ファイルです。
%定義 NAME
プリプロセッサシンボルを定義する NAME。 コマンドラインスイッチと同等
-DNAME.
%ifdef NAME
プリプロセッサ変数の場合 NAME が定義されている場合は、ここからのテキストを処理します %ifdef 〜へ
閉会 %endif、そうでない場合はスキップします。
%endif 終了ディレクティブ %ifdef. %ifdefをネストすることはできません。
%含む ファイル名
というファイルの処理内容 ファイル名。 ネストレベルは XNUMX つだけ %含む
許可されています。
%ident STRING
`を挿入してください#identity STRING' ディレクティブを出力ファイルに追加します。 STRING する必要があります
「」で囲まれた文字列定数。
遺伝性 属性
継承された属性は文書化されていません。 (「 README および btyacc ソース コード
情報はほとんどありません。)それらがどのように機能するかがわかったら、次のアドレスに連絡してください。[メール保護]>!
バグ
解析の最悪の場合の複雑さは、どのような文法でも指数関数的に増加します。
バックトラッキングが発生します。 言い換えると、btyacc によって生成されたパーサーは、
攻撃者が提供できるアプリケーションで使用された場合のサービス拒否バグ
パーサーへの入力として特別に作成されたデータ。 (すべての「通常の」入力データの場合、
潜在的に指数関数的な複雑さは通常は問題になりません。)
バイソンの %予想 ディレクティブはサポートされていません。
ない %それ以外 と %ifndef. %ifdef砂 %含むをネストすることはできません。
作成者
ロバート・コーベット[メール保護]> /[メール保護]> の XNUMX つでした
Berkeley byacc の原著者。 クリス・ドッド[メール保護]> 素晴らしいものを持っていました
バックトラッキング機能を追加するというアイデアを持ち、最初のバックトラッキングを担当します。
変化します。 ヴァディム・マスロフ[メール保護]> コードをさらに改良しました。
このドキュメントは Richard Atterer によって書かれました[メール保護]> Debianの場合
GNU/Linux ディストリビューションですが、パブリック ドメインに寄贈されているため、自由に使用できます。
あらゆる目的のために。
/usr/doc/btyacc/examples/btyaccpa.ske
/usr/doc/btyacc/examples/btyacc-c.ske
/usr/doc/btyacc/README
見る また
バイソン(1) (または「情報バイソン」)、 バイアック(1), ヤック(1), アントラー(1)
btyacc(1)
onworks.net サービスを使用して btyacc をオンラインで使用する