問題タブ [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.
c - Cでフレックスパーサーを呼び出す方法
c でフレックスパーサーを呼び出す方法は?
yacc - リデュースではなくバイソンシフト。reduce/reduce エラーあり
私の言語で私は書くことができます
私のグラマーは、ステートメント間の改行をサポートしていません。else は if でのみ使用できます。ルールにoptionalNLを追加すると
else の前の optionalNL は、3 つの reduce/reduce を引き起こします。理由は、IfExpr の 2 番目のルールを使用して削減できるか、式の間に多くの改行を許可する exprLoop に削減できるためです。
私が何をしても (optionalNL と ELSE の前に %prec を書いてみました)、常に exprLoop に縮小されます。削減する代わりに、この時点で (optionalNL else に) シフトするように bison に指示するにはどうすればよいですか? (exprLoop に、else をエラーにします)。
テストするサンプルファイル
y.output http://www.pastie.org/707448
代替 .y および出力。\n を見て先を見越しており、ルールを縮小するか続行するかはわかりません。ルールの順序を変更して、異なる結果を取得します。しかし、常に \n を期待するか、常に else を期待するため、1 つのルールは常に無視されます。状態 15
Kinopiko さん、ご回答ありがとうございます。
私は彼のコードを競合がないように変更し、より柔軟にすることに取り組みました。ここに私のファイルがあります
test.y
test.y
コンパイル後に自動実行されるテスト ファイル
c++ - Yacc 文法規則コードをスタックすることは可能ですか?
ルールに一致するたびに初期化コードを実行する必要があるとしましょう。冗長性を減らすにはどうすればよいでしょうか?
また、次のようなことは可能ですか
compiler-construction - Yaccプログラムが関数宣言を認識しない
私のプログラムは、以下を関数宣言として認識できるはずだと思います。
しかし、そうではありません。
これが私のyaccファイルの関連部分です:
なぜそれを認識しないのですか?
c - lexでyyinがyaccのmain関数を持つファイルを指すようにする方法は?
mainに渡された引数をyaccにファイルに保存しています。ここで、lexにターミナルではなくこのファイルから入力を読み取らせたいと思います。yyinを次のようなファイルにポイントできることはわかっていますyyin = fopen("fn","r");
が、これはmainがlexにある場合にのみ機能します。このyyin宣言をyaccのmainで使用すると、エラーが表示されるので、この問題を解決するための何かを提案してください。
parsing - yacc パーサーを使用したシンボル テーブルの作成に関する質問
yacc パーサーが次のコードに遭遇した場合:
foo の属性として int a と int b を追加する必要がありますか? 私が今持っている方法では、a と b を別々のテーブル エントリとして入力します。
parsing - LALR パーサーでシフト/リデュースの競合を解決する
PLY を使用して自分の言語用のパーサーを構築してきましたが、shift/reduce の競合が発生して問題が発生しています。私の言語には、構文 ala C++ テンプレートを持つジェネリック型があります。だから今、私は次のようなルールを持っています:
ただし、解析できないことがわかりました。
(これは明らかな理由で問題です)。デバッグ出力は次のとおりです。
さらにパーサーが必要な場合は、提供できます。ありがとう。
編集:私に提案された1つの解決策は、型を独自のトークンにすることでした。私の言語は C/C++ のようなプリプロセッサ インクルード システムを使用していないため、これには少し作業が必要になりますが、それでも可能だと思いますが、文法に制限されたソリューションを希望します。
yacc - %glr-parserを使用する必要がありますか?
私はシフト/リデュースエラーを遠ざけています。ついに私は自分の試合に出会ったと思います。
問題は、int[]が次のように定義されていることです。
一方、a[0]は次のように定義されます
VarとTypeはどちらも、有効な変数であるVARとして定義されています[a-zA-Z][a-zA-Z0-9_]
。ダミートークン(**Decl** Type OptSquareBrackets
代わりになど)を追加する以外に、競合が発生しないようにこれを書き込む方法はありますか?この1つのルールから、1つのシフト/削減と1つの削減/削減の警告が表示されます。
compiler-construction - yacc でシンボルテーブルを構築するときにスコープを考慮する方法は?
私の yacc パーサーはシンボル テーブルを作成しますが、スコープを考慮する必要があります。どうすればいいですか?スコープを終了すると、シンボル テーブルがどのように破棄されるかについて聞いたことがあります。これを行う方法についてはまだあまり明確ではありません。
yacc - '(' ではなく ')' に shift reduce/conflict があるのはなぜですか?
私は次のような構文を持っています
と
および (var)
私のルールは次のようなものです
問題は、それが ) に属している%(CommaLoop)
かどうかを判断できないように見えることです% (val)
が、( の代わりに ) に文句を言うのです。一体何ですか? 文句を言う(
べきではありませんか? どうすればエラーを修正できますか?%(
トークンを作成することは良い解決策ですが$(
、これを行う前にエラーではない理由を確認したいと思います。