問題タブ [gppg]
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 - シフト削減コンフリクト
あいまいさがないとわかっている文法の shift/reduce 競合を理解するのに問題があります。ケースはif elseタイプの1つですが、コードブロックを区切る必須のEND句があるため、「ぶら下がっているelse」の問題ではありません。
gppg の文法は次のとおりです (これは Bison のようなコンパイラ コンパイラです ... エコーではありません)。
競合の出力は次のとおりです。
私はすでにすべてを切り替えており、それを解決する方法を知っていますが、その解決策には、右再帰のために「elseif」で左再帰を放棄することが含まれます。
この問題に関してインターネットで見つけたすべての希少なドキュメントを調べましたが (最後にいくつかのリンクを投稿します)、まだエレガントな解決策を見つけていません。ANTLR については知っていますが、今は検討したくありません。ソリューションを Yacc/Bison パーサーに制限してください。
/* empty */ ルールを削除し、空のリストを必要とするすべてのものを複製することでなんとかそれを実現できましたが、私が取り組んでいるより大きな文法では、「スパルゲッティ文法症候群」のようになってしまいます。
ここにいくつかのリンクがあります:
http://nitsan.org/~maratb/cs164/bison.html
c# - C# と gppg を使用して、抽象構文ツリーを構築するにはどうすればよいですか?
これをほとんどすぐに使用できる方法はありますか?
収集したトークンを使用して、どのリーフをどのブランチに配置する必要があるかを判断し、最終的に TreeNode オブジェクトを生成する大きなメソッドを作成することもできましたが、gppg は提供された正規表現を使用してすべてを処理していたため、もっと簡単な方法はありますか?そうでない場合でも、AST を作成する問題にどのようにアプローチするのが最善かについての指針をいただければ幸いです。
ばかげたことを言って申し訳ありませんが、私はコンパイラ ゲームを始めたばかりです。:)
parsing - Shift / Reduceの競合を支援する-モデル化を試みる(XA)*(XB)*
EBNF式をモデル化しようとしています
これを表すように見えるyacc(MPPGを使用しています)文法を作成しましたが、テスト式と一致しません。
私が一致させようとしているテストケースは
レクサーからのトークンストリームは
文法解析では、「Shift / Reduce競合、KW_Declareの状態6」があると示されています。「%leftPrologHeaderList PrologBodyList」でこれを解決しようとしましたが、どちらの解決策も機能しません。
KW_Declare KW_Namespace KW_Variable Separatorはすべて、値が「declare」、「naemsapce」、「variable」、「;」のトークンです。
parsing - YACC出力をAST(トークンツリー)にする
YACC(または私の場合はMPPG)に抽象構文木(AST)を出力させることは可能ですか?
私が読んでいるすべてのことは、YACCにこれを実行させるのは簡単であることを示唆していますが、ツリー内のノードを構築するときに、いつノードを上に移動するかを知る方法を見つけるのに苦労しています。
c# - GPPG (bison) - 「表現式」の概念を実装する方法
プログラミング言語のパーサーを生成するために GPPG (基本的に C# の bison) を使用しています。本当に厄介な部分を除いて、すべてが順調に進んでいます。私たちが解析している言語には、一種の「暗黙の比較」規則があり、「式式」は「式 == 式」として解釈されます。
たとえば、これは完全に有効なステートメントです。
これにより、パーサーの生成中にあらゆる種類の競合が明らかに発生します。それらを解決するための私の最初の試みは、これらの線に沿ったものでした(簡潔にするために編集しました)。ルールのリファクタリングを試みたところ、もはやあいまいではないように見えますが、明らかな何かが欠けているに違いありません。
これは、私が抱えている競合を示す非常に小さな文法であり、それを解決しようとした方法はうまくいきません
どんな助けでも大歓迎です
c# - パーサー ジェネレーター: GPLEX と GPPG を一緒に使用するには?
優れた C# パーサー ジェネレーターの投稿を調べた後、GPLEX と GPPG に出くわしました。GPLEX を使用して、GPPG がツリーを解析および作成するためのトークンを生成したいと考えています (lex/yacc の関係に似ています)。ただし、これら2つがどのように相互作用するかについての例を見つけることができないようです. lex/yacc を使用すると、lex は yacc によって定義されたトークンを返し、値を yylval に格納できます。これは GPLEX/GPPG でどのように行われますか (ドキュメントにはありません)。
添付されているのは、GPLEX に変換したい lex コードです。
ありがとう!アンドリュー
c# - GPPG 文法 - ルールは使用されません
文法のルールのいくつかに問題があります。
文法は次のようなものです。
チェックする入力を使用して:
この入力には、「defLine」というヘッドを持つプロダクションの 2 番目のルールを使用する必要があります。
なぜそうしないのですか?3 番目のルールが常に使用され、エラーがスローされます
助けてくれてありがとう、アレックス