問題タブ [yacc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
parsing - yacc での可変長リストの許可
次の構造を解析できるようにしたいと思います。
私はフレックスを使用してトークン化していますが、それは完全に機能しています。解析には yacc (bison) を使用しています。
この構造を許可するための推奨される方法は何ですか? 現在、私のtest.yファイルには次のものがあります。
strcat() は本当に、本当に悪い考えだと思います。私は lex/yacc に関してはまったくの初心者なので (約 3 時間の経験があります)、手首を叩いて正しい方向を示すポインターがあれば最高です。
編集: これの目的は、外部アプリケーション用のテスト ハーネスを作成できるようにすることです。字句解析/解析は、ユーザーが提供するテスト スクリプトを解釈するために使用されます。1 つのコマンドで、ユーザーはアプリケーションにメッセージを送信できます。次に、複数行の応答を読み取り、ユーザーがスクリプトで提供した可変長の文字列リストと比較します。上に投稿したフラグメントは、考えられる応答をユーザーに定義させようと考えた方法です。
例えば:
また
c - Bison/Yacc と再帰規則を使用して配列を構築する方法
Bison を使用して、次のようにすべてを 1 つの長い文字列にまとめる方法を見つけました。
と:
しかし、問題は、2 番目のルールで $2 を再度分割して解析する必要があることです。連結を使用する代わりに配列を設定する方法はありますか? 私はこれについて間違った方法で進んでいますか?
理にかなっているリンクされたリストのようなものを構築する必要がある場合は、arg_list にバインドしてメモリをクリーンアップする適切な方法がわからないだけです。
c - Bison/Yacc で %union 定義に構造体を含める
Bison との共用体の一部として構造体を含めようとしていますが、%union の「構造体ノード引数」でエラーが発生します。
コード:
私が間違っていることを知っている人はいますか?
c - Flex(lex)およびBison(yacc)でのエラー処理
バイソンマニュアルから:
各入力が1行である単純な対話型コマンドパーサーでは、エラー時にyyparseが1を返し、それが発生したときに呼び出し元が入力行の残りを無視するようにするだけで十分な場合があります(その後、yyparseを再度呼び出します)。
これは私が望んでいることとほぼ同じですが、仕事に取り掛かるのに苦労しています。基本的には、flexでエラーを検出してエラーを検出し、エラーが検出された場合は、Bisonに行全体を破棄してもらいます。私が今持っているものは、私のコマンドがまだ実行されているため、正しく機能していません:
私のBisonファイル:
そして私のフレックスでは:
c - Flex/LexおよびYacc/Bisonを使用して可変置換を行う方法
ウィキペディアの補間定義 私はフレックス/バイソンを学んでいて、それを使って独自のシェルを書いています。私は変数補間を行うための良い方法を見つけようとしています。これに対する私の最初のアプローチは、ホームディレクトリの〜や$ myVarのようなものをフレックススキャンしてから、ルックアップ関数を使用して返されるものにyyval.stringを設定することでした。私の問題は、テキストが1つのトークンで表示される場合、これは役に立たないということです。
私が変数に対して持っているlex定義:
次に、私の文法には、次のようなものがあります。
この種のことを処理する良い方法を知っている人はいますか?私はこれについてすべて間違っていますか?
parsing - 不完全な文法規則を無視するパーサー/レクサー
私は ocamlyacc と ocamllex で書かれたパーサーとレクサーを持っています。行末のセミコロンを忘れた場合のように、解析するファイルが途中で終わっても、アプリケーションは構文エラーを発生させません。私はEOFを発生させてキャッチしているため、lexerが未完成のルールを無視しているためだと認識していますが、構文エラーを発生させるにはどうすればよいですか?
これが私の現在のパーサーです(簡略化)、
およびレクサー (簡体字)、
サンプル入力ファイル、
解決策の 1 つは、コマンド ルールに再帰呼び出しを最後に追加し、空のルールを追加することです。これらはすべて、メイン プログラムに戻るリストを作成します。私はおそらくEofを期待として解釈し、レクサーのエラーではなく終了条件を解釈していると思いますが、これは正しいですか?
c - Bison/YACC 文法に関する混乱
次の文法では、この種の入力で構文エラーが発生します。
先読みの仕組みと関係があると思いますが、これは私の最初の文法であり、なぜこのように機能しないのかについて少し混乱しています: external_cmd GT WORD はリダイレクト、リダイレクトはコマンド、コマンドはコマンドなので、入力コマンド NEWLINE が機能するはずです。
文法のトップルール:
エラー トークンが発生したときのデバッグ/詳細入力:
更新:
external_cmd は:
yacc - bison shift/reduce problem 移動 add op を部分式に
もともと例ではこれがありました
「もっとシンプル」にしたかったので、これを書きました(加算と減算の両方で「+」を実行することに気づきました。ただし、これは例です)
これで、シフト/リデュース エラーが発生します。まったく同じはずです-_-(私にとって)。これを修正するにはどうすればよいですか?
編集:物事を明確にするために。最初のものには警告/エラーはありません。%left を使用して優先順位を設定します (また、%right を = およびその他の右側の操作に使用します)。ただし、サブ式に入ると適用されないようです。
c - バイソンとの構文解析
O'ReillyからFlex&Bisonを購入しましたが、パーサーの実装に問題があります(トークンに分解することは大したことではありませんでした)。
巨大なバイナリ文字列があり、ビットを足し合わせる必要があるとします。すべてのビットはトークンです。
1101010111111
または、そのことについては、「操作」のないトークンのコレクション。
そのような文法は正しいでしょうか?
またはそれを行うためのより良い方法はありますか?