問題タブ [pegjs]
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 - PEGJS: 述語の最初の構文の AST を生成する
私は pegjs の探索に戻ってきましたが、核となる概念をまだ理解していないことは明らかです。述語で始まり、次にオペランドのリスト (別の述語を含む可能性があります) で始まる「クエリ言語」を解析しようとしています。したがって、簡単な例は次のようになります。
上記を次のように変換したいと思います。
このクエリ:
このASTになります:
私の文法は近いですが、いくつか問題があります。これが現在の PEGJS 文法です。オンラインの pegjs パーサー ( http://pegjs.majda.cz/online )に直接貼り付けることができます。
上記の文法は、私が示した 2 つの例を処理しますが、2 つの問題に気付き、次の 3 つの質問に至りました。
1.文法は、この一見単純な入力で失敗します (重要なのは、ネストされた OR が親 OR の直後に来て、「文字列」が最後にあるということです):
何がこれを引き起こしているのか、またはそれを修正する方法がわかりません。
2.文法には現在、operand
ルールに対して次のばかげた行があります。
.の前の 3 行目の先頭の空白 (ws) に注意してくださいor_predicate
。その空白がないと、「最大コールスタックサイズを超えました」というエラーが表示されます。左再帰に関係していると思いますが、それについては肯定的ではありません。理想的には、必要な「ws」がないようにしたいので、次のようなスペースのないクエリが機能します。
現時点では、次のような余分な空白を人為的に追加する必要があります。
3. この文法へのアプローチは完全に間違っていますか? これは私が試みた 2 番目のものであり、1 番目は pegjs 算術の例に基づいていたので、これについて完全に間違っている可能性があり、それがこれらの問題に遭遇している可能性があることに気付きました。
あなたの助けと時間をありがとう!
よろしくお願いします、
エド
peg - 定数と識別子の解析
基本的にすべて大文字の文字列である定数に一致させたい。
また、小文字と大文字が混在する可能性のある識別子を照合したいと考えています。
問題は、一致しようとするとAsd
、次のように表示されることです。Line 1, column 2: Expected [A-Z_0-9] or end of input but "s" found.
定数ルールに一致するようですが、失敗しても識別子ルールにスワップしません...
問題は、定数も有効な識別子であるように思われますが、あいまいさを解消するルールを理解できません。定数の一致が失敗した場合は、識別子ルールを試してみるべきだと思います...
angularjs - AngularJS webapp の Peg.js
AngularJS Web アプリケーションがあります。
アプリケーションで peg.js を使用したいと考えています。私はちょうど peg.js 文法を書きました: CriteriaValue.pegjs とコマンドラインでパーサーを生成しました: CriteriaValue.js を生成しました
pegjs CriteriaValue.pegjs
。
誰かがパーサーの使い方を説明してくれませんか?
var result = parser.parse('my string'); 動作しません。
プランカーを作成しました: http://plnkr.co/edit/Ae05SeZAjKOQ75B3lvLc?p=preview
javascript - PEGJS : ネストされた pegjs 文法
次のような入力を解析したい
2 or 2 or 2
または無効です2 and 2 and 2
。2 or 2 and 2
要するに、入力内で一緒に発生したくand
ありません。or
javascriptを使用せずに、以前に見た変数を保存せずに、ペグでこれを行う方法はありますか(私はすでに解決策を持っています)?