問題タブ [lex]
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.
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 では失敗します。
bison - バイソンを使用するときにゴミを見る
私はBisonを使用してコンパイルしようとしています(これが正しい単語であるかどうかはわかりません)が、このソースコードをコンパイルしようとすると:
コンソールに「ゴミ」が表示されます(ファイルなどではありません)。http://pastie.org/650893をご覧ください。
よろしくお願いします。
c - Flex と Bison との字句結合
一般的な Flex/Bison パラダイムに適合しない言語を認識しようとしています。セマンティック コンテキストに応じて、完全に異なるトークン ルールがあります。例えば:
Bison は明らかにこれらのタイプの文法の認識をサポートしていますが、それらを効果的にサポートするには「字句結合」が必要です。これを行うためのインターフェイスを提供しますが、コンテキストに応じて異なるフレックス正規表現を正確に指定する方法については混乱しています。
前もって感謝します :)
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 は使用していません。この方法を維持したいと考えています (したがって、オブジェクト内にパーサーをカプセル化することは避けます)。
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 をクラスとして定義し、構造体へのポインターの代わりにそれへのポインターを使用することは可能ですか?
前もって感謝します、ジャック
c - GCC と Flex/Bison で効果がないという警告文
プロジェクトを gcc と -Wall オプションを使用してコンパイルすると、flex ファイルの存在しない最後の行に効果のないステートメントに関する警告が表示されます。
警告:
シェル コマンド:
lex ファイルの最後の部分:
この警告が表示される理由を知っている人はいますか?
すべての #line ディレクティブを抑制すると、エラーは次のようになります。
次の ECHO 行を指します。
c - flex/lex yacc/bison マルチスレッド環境
マルチスレッド環境で flex/bison|lex/yacc によって生成されたコードを使用できますか? グローバル変数がたくさんあると思います。どうすれば修正できますか?