問題タブ [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.
grammar - flex から yacc にリテラルを返す方法は?
私の yacc ファイルには、次のようなものがあります。
ID、NUM、INT、および VOID は flex から返されるトークンであるため、yacc はそれらを問題なく認識します。問題は、上記に「[」や「;」のようなものがあることです。これらが flex によって認識された場合、yacc には何を返す必要がありますか?
grammar - flex/yacc で作成したプログラムが常に識別子を認識しない
簡単な文法を認識するプログラムを作りました。有効なステートメントであると思われるものを入力すると、エラーが発生します。具体的には、識別子から始めると、自動的に構文エラーが発生します。ただし、「int」が前に付いている場合、識別子を使用してもエラーが発生しないことに気付きました。a が識別子の場合、「int a;」と入力すると これで結構です。しかし、「a = 3」と入力すると、エラーが発生します。a を単独で入力すると、エラーが発生します。
lex ファイル:
yacc ファイル
syntax - 私の文法の何が問題になっていますか
私はyaccパーサーに以下を入力しようとしています:
yaccファイルで定義されている内容によれば、私には有効に見えますが、返された後に「構文エラー」メッセージが表示されます。何故ですか?
yaccファイル:
gcc - 私の flex/yacc プログラムは、2 つの異なる Linux マシンで異なる方法でコンパイルされます
1 台 1 台のマシンで、すべてが正常にコンパイルされます。別のマシンでは、gcc を使用して出力ファイルを作成すると、-ly オプションについて不平を言います。-ly オプションを削除すると、プログラムは作成されますが、実行方法が異なります。何が起こっていますか。この Linux マシンでプログラムを正しく実行するにはどうすればよいですか?
parsing - このyaccパーサーの競合は何ですか?
yaccで-vオプションを使用して、y.outputファイルを作成しました。ファイルの上部に「
状態98の競合:1シフト/削減
ファイルのさらに下には、次のものがあります。
競合とは何ですか?どのように修正できますか?
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 マシンと同じように正しく機能しません。
問題の原因は何ですか?
grammar - この yacc コードにシフト/リデュース エラーはありますか?
shift/reduce の競合があるというメッセージを yacc から受け取りました。yacc ファイルのこの部分から来ていると思います。
競合が見えますか?どうすれば修正できますか?
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であるかどうかを確認する必要があります。