問題タブ [jison]
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.
javascript - JISON パーサーから抽象構文木 (AST) を取得するには?
そこで、JISON を介してパーサーを生成しました。
私の質問は、今ASTを取得するにはどうすればよいですか? 入力に対してパーサーを実行できることがわかりますが、機能する場合は true を返し、機能しない場合は失敗します。
記録のために、私は JISON を使用しています: http://zaach.github.com/jison/docs/
javascript - バイソンの優先順位(実際にはjisonを使用していますが、同じである必要があります)
jison(Bisonと同等のJavaScript)を使用していますが、次の優先順位の問題があります。電卓のデモ http://zaach.github.com/jison/try/を使用して説明します
そのままで問題なく動作します。優先順位は
文法は
'*'行を次のように変更すると
優先順位をに変更します
もう動作しません。同じように動作するはずではありませんか?これは、たとえば、2 x + 3が(2x)+3として解析される代数構文を最終的に作成したい場合に役立ちます。
ありがとう!
bison - 暗黙の優先順位
私は本を読んでいます—「フレックスとバイソン」パーサジェネレータがどのように機能するかを理解するために、例があります:
また、本では、上記の文法は、個別の非終端記号を使用することにより、暗黙的に優先されると述べています。しかし、それはどのように機能しますか?次の例があると仮定します:(1 + 3 * 2
空白はスキップするだけです)最初のトークンを読み取り、それが文法を「バブリング」する時間と同じか、それとも1
スタックにプッシュされますか?次のトークンはどの文法規則からチェックされますか?なぜこの文法では、乗算が加算よりも優先されるのですか?NUMBER
term
factor
javascript - Node.js で Jison テストを実行するには?
Jison 単体テストを実行しようとしていますが、コマンドが失敗します。どうすれば修正できますか?
programming-languages - AST ノード (Jison) から行番号を取得する方法
私は Jison を使用して、変数を含む単純な電卓言語を構築しています。これらの変数を JavaScript と同様に機能させたいと考えています。つまりvar
、最初にキーワードで初期化する必要があります。私の言語では、変数が再初期化された場合にエラーを表示したいと考えています。
私の質問は、AST ノードの行番号を取得するにはどうすればよいですか? 私の文法ファイルでは、パーサーからAssignVariable
オブジェクトに行番号を渡すことができますが、これを行うためのより良い方法があるかどうか疑問に思っています。
他のタイプのエラー チェックのために、コンパイラの他のノードの行番号も必要になります。
この質問からのより高レベルのポイントは次のようになります: Jison (または同様のもの) を使用してコンパイル時エラーを検出して処理する最良の方法は何ですか?
javascript - 文法の衝突を避ける方法
文法ファイルがあります — https://github.com/itrelease/fubar-script/blob/jsast/src/grammar.jsですが、競合が発生し、これを解決する方法がよくわかりません。誰かが私を説明できれば、それは役に立ちます。
このルールは衝突を引き起こします:
bison - ExpressionInterpreterデモのExpressionASTパーサー
この「電卓」Jisonの例を、式インタープリターではなく式パーサーに変更しようとしています。式をすぐに評価するのではなく、式を説明するJSONオブジェクトを出力したいと思います。
- 演算子とオペランドを要素として持つjavascript配列を返すようにデモを変更しようとしました。
- 解析すると
1 + 2
、に文字列化されたJSON配列を取得することを期待しています['+', 1, 2]
。代わりに私は得る1
。 - これはNUMBERアクションに直接関係しているようです-私が返すように言うことは何でも私が返すすべてです。
- ただし、 `1 2 + 3'を解析しようとすると、構文エラーが発生します。
(有用なASTモデルで式を表現しているかどうかは気にせず、Jisonを学習しようとしているだけです)
bison - エスケープ文字の文法
マークアップ区切り文字をエスケープできるマークアップ言語用の Jison (Bison) 文法を作成したいと考えています。
これらは有効です:
例は、おそらく次のように解釈されます (JSON 表現)。
のエスケープ[]\,
は最小限ですが、エスケープが不要な場合でも、印刷可能な文字をエスケープできるようにすることはおそらく理にかなっています。
印刷できない文字のエスケープがサポートされていないといいのですが。つまり\
、行末の a は不正です。正規表現.
には改行が含まれていない可能性があるため、これは無料である可能性がありますが、他の印刷できない文字でも発生するはずです。
Bison 定義などでリテラル文字をエスケープするための多くの結果と混同されているため、これをグーグルで検索するのは困難です。
Bison で定義された言語でエスケープ文字をサポートする最もエレガントな方法は何ですか?
編集
ここに私がこれまでに持っていて、 Jison でテストできるものがありますが、機能1
していません (何かあれば返されるだけです)。テキストがエスケープされずに到着することは期待できません。それは避けられますか?
bison - Shift/Reduceの競合を解決する文法仕様
私はJison(Bison)を使用して単純なマークアップ言語を作成しています。私は明らかにこれに慣れていませんが、わずかなバリエーションが非常にうまく機能しています。S/Rの競合の原因がわかりません。
'Text'が2つのレクサーアクション(開始条件が異なる)によって返されることは問題ではないようです。文法のルールが少なくなり、ユーザーへのエラーメッセージが一貫しているため、これが気に入っています。コンテキストに関係なく「テキスト」ルールを共通にすることを試みました。また、各トークンに異なる名前を付けることも試みましたが、すべてが一緒になっている場合、S/R競合には影響がないようです。
パーサーは、プレーンテキスト、サブ配列、およびさまざまな特殊ノードを含むjsonオブジェクトを作成することを目的としています。
仕様:
警告:
ジェネレータアルゴリズムが異なれば、多かれ少なかれ問題がありますが、すべて問題があるようです。
ありがとう!
javascript - JISON への宣言の追加
ここでは、JISON 電卓の例をわずかに変更したバージョンを示します。
!
演算子の定義のわずかな違いに注意してください。fact
関数をインラインで行うのではなく、外部で定義しようとしています。
今のところ、実行時に教えてくれますfact is not defined
。どうすればこれを修正できますか? また、電卓の例で階乗定義を 2 つの中括弧で囲んでいるのはなぜ{{ /*like so*/ }}
ですか?