問題タブ [bison]
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 - フレックス、char の定義
char (つまり 'a AND 'a') を定義したいのですが、エラーのチェックに問題があります。ここで、ルールを記述してチェックする方法は次のとおりです。
コード
そして最後にそれをチェックします:
yacc - Bison / Yacc、リテラルトークンに独自の値を返すようにしますか?
以下は私のルールです。$2を'='に置き換えると、コードが機能します。デフォルトでは、すべてのリテラルトークンがASCII値を使用することを知っています(したがって、複数文字のトークンに定義が必要な理由)
以下は動作しません。関数は、私が期待するように'='ではなく0で呼び出されます。設定できるオプションはありますか?(manページでは表示されません)
したがって、別のコードではMathOp: '=' | '+' | '%' ...
、なぜ私が興味を持っているのかがわかります。
c++ - C /C++で文字列パーサーを検索する
私は聖書のテキストに焦点を当てたオープンソースプロジェクトに取り組んでいます。検索文字列を作成するための標準の文字列形式を作成したいと思います。次に、検索文字列を解析し、指定されたオプションを使用して検索を実行する必要があります。検索の範囲から、複数のテキストの検索、ワイルドカードなど、さまざまなオプションがあります。
lex / yaccのようなものを使用して、この形式のパーサーを生成するのは良い考えかもしれないと思います。Xapianプロジェクトは、同様の目標を達成するためにレモンを使用していると思います。私の質問は、これらのツールの1つ(または複数)を使用することがこれを達成するための最良の方法ですか?
質問に加えて、これらのツール(およびオプションである可能性のある他のツール)のリソースへのリンクをいただければ幸いです。私がこれまでに遭遇した最大の問題は、ほとんどの例とチュートリアルが、文字列形式を解析するのではなく、プログラミング言語または電卓のような単純なものを対象としていることです。
gcc - 私の flex/yacc コンパイラが別の Linux マシンで正しくコンパイルされないのはなぜですか?
私のマシン (cygwin を実行している Windows) では、正しくコンパイルされます。Flex はバージョン 2.5.35、bison はバージョン 2.3 です。
Linux マシン 1 では正しくコンパイルされます。Flex はバージョン 2.5.4 で、bison はバージョン 1.875c です。
Linux マシン 2 では正しくコンパイルされません。Flex はバージョン 2.5.4 で、bison は 2.3 です。
flex/bison のバージョン番号を見ると、私のマシンで正しくコンパイルされていれば、マシン 2 でも正しくコンパイルされると予想されますが、そうではありません。
Linux マシン 2 で gcc -c y.tab.c を実行すると、次の警告が数回表示されます。
警告: 組み込み関数 'printf' の暗黙の宣言に互換性がありません
そして、次を実行すると
gcc -o cminus y.tab.o lex.yy.o -ly -lfl
次のエラーが表示されます。
このエラーは、プログラムがコンパイルされるように gcc の -ly オプションを削除することで削除できますが、コンパイルされたプログラムは、私のマシンや他の Linux マシンと同じように正しく機能しません。
問題の原因は何ですか?
yacc - バイソンファイルの終わり
ファイルの末尾に空行を置き忘れると、プログラムで構文エラーが発生します。問題は、私の文法が改行が現在の行を終了することを期待していることです。改行が存在しないため、バイソンはルールを終了しないため、構文エラーを生成します。
これを解決するにはどうすればよいですか?<<EOF>>
私はリターンを試みましMY_EOF
たが、レックスが恐ろしい死を遂げたとき。デフォルトの EOF には、呼び出していないコードがあると思います。それらがどのような機能であるかはわかりません。EOF を使用してエラーを作成するsymbol EOF is used, but is not defined as a token and has no rules
c++ - YACCでこのShift/Reduceの競合を解決する方法
私はこのような文法を持っています:
「1つ以上のrule1に一致します。ここで、rule1は1つ以上のrule2であり、rule2は1つ以上のrule3などです。それぞれ改行で区切られます」。次の例を見てください。
これを行うと、shift / reduceの競合が発生しますが、文法を変更して停止するにはどうすればよいですか?基本的に、新しい行の後で分岐し、次のものがTERMINAL2またはTERMINAL3であるかどうかを確認する必要があります。
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 文法規則コードをスタックすることは可能ですか?
ルールに一致するたびに初期化コードを実行する必要があるとしましょう。冗長性を減らすにはどうすればよいでしょうか?
また、次のようなことは可能ですか
bison - bison YYSTYPE: char* を使用しようとしています
一部のコードを解析するには、flex と bison を使用する必要があります。
YYSTYPE のデフォルトの型は ですがint
、そのように宣言したことはありません。それはバイソンのデフォルトですか?
文字列を返すと、とても助かります。私はこれを読みました:Bison の警告を解決する方法 "... 宣言された型がありません" これは良いアプローチのようです。(ユニオンの全機能はまだ必要ありません。char* の部分だけですが、後で役立つ可能性があるため、ユニオンを使用することもできます。)
それは私のために働いていません。次のエラーが表示されます。
私のy
文法ファイルからの宣言は次のとおりです。
ここに私の.l
ファイルからの1行があります:
エラーを解決するには、他に何をする必要がありますか?
grammar - Linux で Bison --graph=[file] を使用する際のヒント
最近 (約 1 か月前)、会社の社内拡張言語に新しい構造を導入しようとしていて、いくつかの reduce-reduce エラーに苦しんでいました。私は最終的にこの問題を解決しましたが、 y.outputファイルを掘り下げるのは簡単なことではありませんでした。
実験として、Bison の--graph=<file>オプションを使用してDOTファイルを出力してみました (標準ビルドでは Bison ではなく Byacc を使用していることに注意してください)。私は「ターンキー」Linux ボックスを使用しているため、Graphviz をインストールしておらず、RPM から簡単にインストールできませんでした (Red Hat Enterprise Linux 4 で作業しています)。代わりに、ソースからビルドしました。
最初の実験として、Postscript の出力でdottyを実行してみました。現在、私たちの内部言語は、平均的な自家製のチューリング完全な動的型付けスクリプト言語ですが、その後のことについては準備ができていませんでした。dottyの実行には 4 時間以上かかりました (2GHz デュアルコア AMD64 ボックス)。そして、それが完了したとき、レンダリングされたグラフは、私が読むことができるものではありませんでした.
ですから、簡単に言えば、私はアドバイスを求めています。私が取った「デフォルト」アプローチよりも結果を改善するスイッチのセットはありますか? での経験を求めています
- 「レンダリング」時間の最適化
- グラフの読みやすさの向上
- より優れたグラフィカル ビューアに関するアドバイス