問題タブ [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.
compiler-errors - `yyerror'の複数の定義
Bison(またはyacc)を使用して、エラーを解決するにはどうすればよいですか?
%option noyywrap nodefault yylineno
一番上に試作品を書いてみました。運がない。
-編集-
気にしない。使用する例をコピーして貼り付けたとき、すでにyyerror関数があることに気づいていませんでした。
yacc - Bison 構文エラー (初心者向け)
私は戻ってきて、独自の言語と OS を書いていますが、独自の開発言語の開発を開始しているため、Bison を使用するといくつかのエラーが発生し、それらを解決する方法がわかりません。これは私の *.y ファイル コードです。
そして、このソース コードで Bison を使用しようとすると、次のエラーが発生します。
calc.y:1.1-5: 構文エラー、予期しない識別子:
yacc - バイソンとレックス文字列対文字
フォームの評価と表現を試みています
expr は、特定の文字から構成される文字列または上記の関数のいずれかです。したがって、これは次のようになります
問題は、次の形式でトークンにブレーキをかけた場合です。
次のようなものがある場合、文法の構築に問題があります
文法が間違っているのか、ASTの実装が間違っているのか、よくわかりません。
nm の場合、expr は expr expr になり、n*m の値を返すため、論理に欠陥があることがわかりました。これはまだ nm です。これは無限ループを引き起こしますか?そのような式をどのように解析すればよいですか。
石を投げないでください。バイソン初心者
後で編集 して、AST といくつかのリンクされたリストの背後にあるコードをクリーンアップしてテストすることができました。唯一の問題は文法のままです。
この文法は、Frac[m^2][m^4] node / node K m^4 node K m^4 のような expr では失敗します。
c++ - Simple Flex / Bison C ++
私はすでに自分の答えを探しましたが、簡単な例ではすぐに応答がありませんでした。
C ++クラスを使用してASTなどを作成したいという理由だけで、g++を使用してflex/bisonスキャナー+パーサーをコンパイルしたいと思います。
インターネットで検索すると、いくつかのエクスプロイトが見つかりました。必要なのは、lexファイルでextern"C"を使用していくつかの関数プロトタイプを宣言することだけだということです。
だから私のshady.yファイルは
shady.lファイルは
最後に、makefileでgccの代わりにg++を使用します。
flexとbisonは正しく機能しますが、リンクすると次のエラーが発生します。
もちろん、bisonファイルの関数について何かを変更しようとすると、yylexがyyparseのスコープで宣言されていないと表示されます。
見た目よりも複雑なものを単純に解決しようとしていますか?実際、オブジェクト指向の方法で解析とレクサーにアクセスするために閉じた構造は必要ありません。それを機能させたいだけです。
bisonファイルでC++を使用して(ASTを作成し)、C ++オブジェクトからyyparse()を呼び出せるようにしたいだけです。
前もって感謝します
macros - yacc/bison lex での #define マクロの処理
#define
yacc/bison でマクロを実装するにはどうすればよいですか?
すべての定義文字は通常の変数と一致する必要があると考えていました。変数は次のように定義されて[a-zA-Z_][a-zA-Z0-9_]*
いるので、変数が定義されているかどうかを確認するためにそこにチェックを入れることができると思います。次に、テキストを本来あるべきものに置き換えます。
どうやってやるの?現時点では、BAD という単語#define BAD
を C で定義したかのように完全に無視したいと考えています。以下はその lex ルールのコードですが、間違っています。また、lex は「BA」がストリームにあることに文句を言います。以下は完全に間違っていて非論理的であることを知っているので、どのようにBADを無視し、次にそれをfloatのようなものに置き換えるにはどうすればよいですか
主な手順は、1) 定義を定義する、2) ソースでそれを検出する、3) lex にマクロ文字を忘れさせる、4) 新しい正しい文字を挿入する、ということを知っています。
warnings - Bison ビルドの警告: 「-s オプションが指定されていますが、デフォルトのルールに一致する可能性があります」
警告が表示されます
「オプションは指定されていますが、デフォルトのルールは一致する可能性があります」とグーグルで検索 すると、Flexマニュアルの診断に関する章と、診断セクションの古いFlexマンページのこのエントリが見つかります。
警告、「-s オプションが指定されましたが、デフォルト ルールを一致させることができます」は、(おそらく特定の開始条件でのみ) デフォルト ルール (任意の 1 文字に一致) が特定の入力に一致する唯一のものである可能性があることを意味します。が与えられたので
-s
、おそらくこれは意図したものではありません。
-s
私のビルドファイルにはオプションがありません。私が書いた
この警告を修正するにはどうすればよいですか?
これは、私の lex ファイルの小さなバージョンです。このファイルも警告をトリガーします
yacc - 複数の flex/bison パーサー
プロジェクト内で複数の Flex/Bison パーサーを処理する最良の方法は何ですか?
パーサーを作成しましたが、同じプロジェクトで 2 つ目のパーサーが必要になりました。ここまでの 3 番目のセクションで、メソッドparser1.y
を挿入し、そこから呼び出しました。main(..)
yyparse
私が取得したいのは、2 つの異なるパーサー (parser1.y
およびparser2.y
) を持ち、それらを外部関数から使用できるようにすることです ( で想定main
しmain.cpp
ます)。
yyparse
関数をファイルの外部にエクスポートする場合、どのような注意を払う必要が.y
ありますか? また、2 つのパーサーをどのように処理すればよいですか?
PS。私は g++ を使用してコンパイルしていますが、C++ バージョンの Flex と Bison は使用していません。この方法を維持したいと考えています (したがって、オブジェクト内にパーサーをカプセル化することは避けます)。
java - Javaに相当するYacc
私はJavaでコンパイラ設計プロジェクトに取り組んでいます。字句解析は(jflexを使用して)行われ、構文解析を行うのにどのyaccのようなツールが最適であるか(最も効率的で、最も使いやすいなど)、そしてその理由を考えています。
c++ - Yacc文法デバッガーはありますか?
私は、社内で20年前のプロプライエタリ言語の拡張を支援してきました。これは、チューリング完全な大規模な言語です。それを別の文法レジーム(Antlrなど)に変換することはオプションではありません(私はこれを決定することはできません)。
ほとんどの場合、文法の拡張はスムーズに進んでいます。しかし、時々私はreduce-reduceまたはshift-reduceを取得します
- 排除するのは難しい
- 時々単に意味をなさない(私の弱い脳にとって)
y.outputファイルと実験的な文法リファクタリングをじっと見つめた後、私は通常、行きたい場所にたどり着きました。時々私は不十分な妥協をしなければなりませんでした。
それで、ブラウジング、実験を強化し、変更のデバッグを可能にする、yacc文法を吸い込むことができるツールはありますか?
プロダクションを追加する場合、「どこでも使用されるアトミックプロダクション」(識別子を考えてください)「ルールfooとの競合」(はい、それよりも多くの情報、s / r、r / rがあります)以上のものを見たいです、しかし私はあなたが私のドリフトを得ると思います)。私の思考の上限を設定し、シンボルスタックとステートマシンを想像しようとする以外に、相互作用のヒントがあると便利です。
更新:明確にする必要があると思います。BerkeleyYaccを使用しています。私は最近のバージョンのBisonを使用してテストしています。出力のために、 -report=itemsetを使用して文法をコンパイルしました。
この投稿での私の目標は、yaccに付属している文法デバッグ機能を強化する外部ツールを探すことです。今日はデフォルト設定で苦痛です。Antlrで使用できるツールなど、より優れたインタラクティブツールを見つけるのを手伝ってください。
parsing - Bison の %union ディレクティブ
バイソンパーサーで抽象構文木を使おうとしていたので、%union
ディレクティブを使ってみました。文法ファイルは次のようになります。
現在の状態では、構造体のみを使用しようとしていたため、ファイルast.h
には次の宣言があります。
私は gcc の代わりに g++ を使用していますが、動作するはずです (Web 上で同様の例を見つけました) が、次のエラーが発生するためast_node
、定義時に不明のようです:YYSTYPE
/shady_parser/shady.y:22: エラー: ISO C++ は、タイプのない 'ast_node' の宣言を禁止しています ./shady_parser/shady.y:22: エラー: 期待される ';' '*' トークンの前 ./shady_parser/shady.l: 関数 'int cyylex()' 内: ./shady_parser/shady.l:35: エラー: 'union YYSTYPE' には 'node' という名前のメンバーがありません ./shady_parser/shady .l:37: エラー: 'union YYSTYPE' には 'node' という名前のメンバーがありません./shady_parser/shady.l:38: エラー: 'union YYSTYPE' には 'node' という名前のメンバーがありません
なぜこれが起こるのですか?
次に、ast_node をクラスとして定義し、構造体へのポインターの代わりにそれへのポインターを使用することは可能ですか?
前もって感謝します、ジャック