問題タブ [lemon]
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.
parsing - LALR(1)関数のパラメーターの空のリスト
単純なLALR(1)文法がありますが、問題が発生しています。
ドットはルールの終わりを示し、角かっこの間の端子には結合性が割り当てられています。ASSIGNは右結合、COMMAは左結合です。
しかし、レモンは、「empty_stmt_list::=」というルールを減らすことはできないと言っています。開始シンボルに接続されていないためです。きっと:-)
「invoke」の解析の競合もあります。empty_stmt_listが実際にステートメントの空のリストである場合、RPARENとCOMMAのどちらかを決定することはできません。
私が達成しようとしているのは、(void)パラメーターを持たない関数呼び出しを解析できることです。
他のすべては期待どおりに機能します。
ありがとう
編集:元の投稿を編集し、削除された文法全体を投稿しました。
parsing - コンマ区切りの関数呼び出しパラメーターのパーサー式
myfunc1()
、、myfunc2(param1)
およびmyfunc3(param1, param2)
(パラメーターの量が不明な)などの式を解析できるパーサーを作成しています。今、私は自分の解析式を正しくしようとしています。レモンパーサージェネレーターを使用しています。これが私が思いついたものです:
今のところ、中括弧の内容は気にしないでください。定義では、空のparams
パラメータ(次々にいくつかの区切り文字)が許可されていますが、現時点では問題ありません。しかし、空でないパラメーターを強制するために定義を変更する必要がありますが、それでもすべてのパラメーターはSEPARATOR
トークンで区切られていますか?
c - 解析中のエラー トークンの回復 (Lemon)
私はパーサー ジェネレーターとして Lemon を使用しています。Lemon を知らなくても、エラー処理は yacc や bison のものと同じです。
Lemon には、解析エラーをキャッチするために一連のルールでエラー トークンを定義するオプションがあります。生成されたパーサーのデフォルトの動作は、エラーの原因となったトークンを破棄することです。トークンを保持できるように、この動作をオーバーライドする方法はありますか?
何が起こっているかを示す例を次に示します。基本的に、各ルールのトークンを一緒に追加して、入力文字列を再形成します。文法の例を次に示します。
入力時:
出力が得られます:
テキスト「 Username 」は part(A) ::= error(B) ルールのパーサーによってジャンクされるためですが、私は本当に欲しいです:
出力として。
バイソンまたは別のパーサージェネレーターでこの問題を解決できる場合、私はそれを答えとして受け入れます:)
php - Lemon Parser-Generator: 非終端記号は評価されませんか?
私はパーサーを学ぼうとしています。私の C スキルはかなり低いので、パーサー ジェネレーターについて学ぶためにPHP Lemonをググってみました。とにかく、ここのコードは通常のレモンの友達にも読めるはずです。
構文解析の質問を処理するときはいつものように、まず簡単な電卓を作成することから始めます。
したがって、私の最初のステップは単純に次のとおりです。
最初のテストを解析するもの:
...次の結果へ:
だから、すべてが期待どおりです。ここで、最終的に操作を処理できるようにするステップの準備を試みますexpression
。
ここで同じテストを実行すると、同じ出力に加えてgot a value: 13
. しかし、私はこれを取得します:
さて、何が起こったのですか?結果行が空なのはなぜですか? 明らかに「13」のexpr
a に評価されます。VALUE
レモンは評価を気にしませんか?どういうわけか自分でそれをしなければなりませんか?しかし、この時点で何も得られない場合はどうすればよいでしょうか。
c++ - レモンの文法から関数呼び出しのあいまいさを取り除くにはどうすればよいですか?
私は次のレモン文法を持っています(実際の文法から簡略化されています):
次の状態では、shift-reduceの競合を修正できません。
問題はa=(b(c))と(a = b)(c)のあいまいさだと思いましたが、関数呼び出しに割り当てよりも優先順位を高くすると修正できると思いました。どんなアイデアがありますか?
parsing - Lemon 解析の競合を修正する
Flex と Lemon を使用して、制約を解析する小さなパーサーを作成しています。Lemon は、私が取り除くことができなかったいくつかの構文解析の競合を報告しています。文脈自由文法で構文解析の競合を取り除くための特定のトリックはありますか?
文法は次のとおりです。
エラーは次のとおりです。
パーサー ジェネレーターのレポート全体はここにあります。http://pastebin.com/TRsV3WvK
ここで私が間違っていることを知っている人はいますか?これらの競合を無視できますか?
parsing - レモンパーサーは LALR(1) または SLR(1) ですか?
私はレモンパーサーのPHPポーションを読んでいます:
アクションテーブルの計算方法によると、パーサーはSLR(1)パーサーのように見えますが、@レモンのホームページでは、LALR(1)パーサーとしての役割を果たしています。
それは SLR(1) または LALR(1) ですか?
context-free-grammar - 私の小さな文法に3つの構文解析の競合があるのはなぜですか?
紛争がどこにあるか知っている人はいますか?
アップデート
削除するexp(res) ::= exp(e1) OP(o) exp(e2).
と、競合は2つだけになりますが、なぜこれが競合を引き起こしているのかわかりません...
UPDATE2
ここで大丈夫な理由: