問題タブ [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.
grammar - ジソン: 実際には競合がないところに競合を減らす
小さなプロジェクト用の型付き変数も含む小さな JavaScript パーサーを生成しようとしています。
幸いなことに、jison はすでに jscore.js を提供しており、これを自分のニーズに合わせて調整しました。タイプを追加した後、削減の競合に遭遇しました。この最小の JISON に問題を最小化しました。
ジソン:
実際、このスクリプトは 2 つのステートメントを解析するだけです。
変数ステートメント
ExpStatement
これは非常に最小化された JISON スクリプトであるため、単純に「Type」を「IDENT」に置き換えることはできません (ところで、これはうまくいきました)。
パーサーを生成すると、次の競合がスローされます。
この競合を解決するためのトリックはありますか?
よろしくお願いします!〜ベンジャミン
javascript - 文法のあいまいさを扱う Jison でパーサーを生成するにはどうすればよいですか?
言語ChucKの Jison を介して JavaScript でパーサーを生成しようとしていますが、生成されたパーサーが処理できない言語にあいまいさがあることを除いて、良いスタートを切りました。元の ChucK コンパイラは Bison によって生成されたものであり、これらのあいまいさを何らかの形で解決できるはずです。
この質問の目的のために、私は問題を解釈された文法に単純化し、曖昧さを 1 つだけ提示しました。参考までに、関連するすべてのファイル (生成されたパーサーを含む) の要旨を掲載しました。プロジェクトの構造は次のとおりです。
- language/lexer.js : レクサー。
- language/grammar.js : 文法の定義と、
generate
Jison を介してパーサーを生成するための関数 ( )。 - language/helpers.js : ヘルパー関数
- src/parser.js : 生成されたパーサー。
- testparse.js : 次のソース コードを使用してパーサーをテストするプログラム:
Type var => out;
.
文法自体は次のようになります。
あいまいさは、非終端 DeclExpression が または のいずれTypeDecl VarDeclList
かに一致する可能性があることPrimaryExpression
です。これにより、Jison は次の警告を発します。
Type var => out;
生成されたパーサーは、次のようにテスト コード ( )の解析に失敗します。
私の理解では=>
、パーサーがルールと照合しようとするのは、演算子の後の部分TypeDecl VarDeclList
です。
では、このあいまいさに対処できるパーサーを生成するにはどうすればよいでしょうか?
javascript - Jison で EBNF グループを適切に使用する方法
Jison で EBNF 拡張機能を使用しているときに発生する状況に対処する方法を見つけようとしています (Jison はデフォルトで BNF のみをサポートします。必要に応じてそのオプションを有効にすることができます)。
単純な XML パーサーを作成しようとしています。XML には、空のタグと空でないタグがあります。空でないタグには、開始タグ、コンテンツ、および終了タグがあります。コンテンツ EBNF ルールは次のように定義されます。
これで、デバッグによって、Jison がキャプチャ グループを $2 に割り当て、一致するものを配列で渡すことがわかりました。ここに一致のリストがあることを期待しているので、これは理にかなっています。しかし、私を本当に驚かせたのは、含まれている配列に要素だけがあり、文字データがない理由です。
たとえば、次の入力文字列を想定します。
ここで、上記の規則により、h、x、および y の表現が得られます。しかし、i と j は欠落します。
私は何かが欠けていると思いますが、それが何であるかはわかりません...
必要に応じて完全な文法を提供できますが、問題を切り分けようとしました。
よろしくお願いします!
よろしく、ハラルド
regex - JISON: 正規表現で「.」を使用する理由 それ以外の \。?
http://zaach.github.io/jison/docs/#specifying-a-languageの例から
なぜこの正規表現で"."
代わりに使用されるの\.
ですか?
bison - この S/R 競合を解決する方法
以下は、私の作業中の EBNF 文法の単純化です。
\n と EOF の両方がトークンとして NEWLINE を吐き出します (EOF の前に単一の末尾の NEWLINE が必要ないように)。次のようなストリームで動作します。
少なくとも 1 つが必須で、残りは で区切られてline
います。例えば:block
NEWLINE
私はこれをやってみました:
しかし、先読みが の場合、Jison は S/R 競合について不平を言いNEWLINE
ます。NEWLINE
ステート マシンは、が新しいブロックの一部なのline
か、最後のNEWLINE*
ブロックなのかを判断するのに混乱していると思いfile
ます (ファイルが NEWLINE/EOF で終わる可能性があるため、これが必要です)。
どうすればこれを修正できますか?
parsing - コード置換 (a la #define)。レクサー?またはパーサー?
tl;dr:#define
前処理ステップを実行せずに、jison を使用してC に相当するものをどのようにエミュレートしますか?
私は、簡潔にするために後で再利用できるコードのチャンクに識別子を割り当てる機能を備えた比較的単純な文法に取り組んでいます。例:
これまでのところ、コードの割り当て行を正しく識別し、「->」の右側の部分を他のパーサー アクションで使用できる辞書に格納するようにパーサーをセットアップしました。以下に示す定義アクションに関連するコード:
保存されたコードのスニペットを実際にトークン化して解析するように jison を取得するにはどうすればよいですか? AST アプローチを採用する必要がありますか? コードをパーサーに挿入する方法はありますか? これは字句解析段階または解析段階で発生する必要がありますか? 短い例のスニペットを使用して、複数の戦略を採用できることを楽しみにしています。
ありがとう!
bison - バイソン/ジソンを理解する
現在、不器用な「手作り」の C# および Java パーサーがある既存の言語用の JavaScript パーサーを作成しようとしています。私はジソンを使いたいと思っており、バイソンの基礎も学ぼうとしています。
答え方がわからない質問は、Bison/Jison の出力は正確には何ですか? 何かを自動的に取得しますか (AST など)? または、bison ファイルを書いている人によるルール アクションを使用してすべてが行われます。たとえば、ルールに適合する新しい変数の割り当てを指定するルールがあるとします。
VariableStatement : VAR VariableDeclarationList ';'
{ var var1 = {name: $1, value: $2 } などのアクションを指定する必要がありますか (まあ、この特定のルールでは機能しませんが、$2 は何らかの端末トークンであると仮定します)。ジソンは実際に新しい変数を作成しますか? それとも私はそれを間違っていますか?
ありがとう!