問題タブ [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.
c - レモンパーサーの2つのことに使用される同じ記号の処理方法
私はドメイン固有言語を開発しています。言語の一部は、精度や記号などのセマンティクスを解析するC式とまったく同じです。
レモンパーサーを使用しています。同じトークンが2つの異なる目的で使用されているという問題が発生しましたが、レクサーの違いがわかりません。アンパサンド(&)記号は、「ビット単位」と「アドレス」の両方に使用されます。
最初は、それらが同じ結合性を持っていないことに気付くまで、それは些細な問題だと思いました。
同じトークンに2つの異なる関連性を与えるにはどうすればよいですか?AMPを(アンパサンドのように)使用してaddressofとbitwiseを作成し、ルールでAMPを使用するか、別のトークン(ADDRESSOFやBITWISE_ANDなど)を使用する必要があります。別々の記号を使用する場合、どのようにしてレクサーからどれを知る必要がありますか(パーサー自体でないとわかりません!)。
c - 生成されたパーサーで構文エラーの行番号をキャプチャするにはどうすればよいですか
私がレモンに渡すトークンはすべて、行番号情報が添付された構造体です。
以下のsyntax_errorの定義を見てください
ただし、エラーがどのファイルと行であったかを報告する方法がわかりません。すべてのトークンに関する情報がありますが、syntax_errorハンドラーで適切なトークンにアクセスするにはどうすればよいですか?
トークナイザー内の自分の場所を個別に追跡し、構文エラーを確認する必要がありますか?構文エラーが発生するまでに、トークナイザーはおそらくパーサーよりも進んでいると思います。
parsing - 後置/中置演算子との優先順位の競合
これがレモンパーサージェネレーター用に書かれた文法です:
コンパイルしようとすると、ジェネレーターは次の競合を生成します。
PreIncrementationとPostDecrementationの両方の優先順位と結合性が文法で明示的に指定されているのに、なぜ競合があるのですか?
parsing - Lemon パーサーを改行で終了させるにはどうすればよいですか?
この古いチュートリアルに従って、レモンパーサーにEOL
トークンの解析を自動的に終了させようとしています。パーサーの関連部分は次のようになります。
Flex によってスキャンされたトークンを使用してパーサーを実行する方法は次のとおりです。
EOL
ここでトークンをチェックする必要をなくし、いつ完了したかをパーサーに判断させたいと思います。それ、どうやったら出来るの?
ありがとう!
sql - レモンを使った「部分解析」
私は、 lemon parser generatorを使用して構築されたSQL 文法を持っています。コマンドを解析するための通常のエントリ ポイントはステートメント (のような) であるため、このステートメントは文法の非終端記号です。これまでのところ、すべて正常に動作しています。SELECT ...
%start
ここで、「部分的な解析」を行いたいと考えています。たとえば、式またはWHERE
句のみを解析します。基本的にこれは%start
、実行時に非端末を変更することを意味します。私はドキュメントでそれについて何も見つけることができませんでした。これはレモンで可能ですか?
そうでない場合は、カスタムの開始点で解析を失敗させるようなことを考えていました。これはかなりハックのように感じます。よりクリーンな方法はありますか?
c - パーサーの削減が早すぎる
基本的に次のような文法があります。
次のように解析します。
それは確かに設定のような名前です。何が起こるかというと:
name = "value" は割り当て ::= 割り当てになります。減少しています。割り当ては定数値であると予想されますが、そうではありません。
レモンのデバッグ出力はhttp://pastebin.com/yHNkNRpfです
その結果、name2 のみがリストに追加されます。私はこれに困惑しています。reduce は理解していますが、代入者が null に設定され続ける理由はわかりません。これを回避する方法はありますが、私は適切な修正を好みます。
レモンのデバッグ出力はhttp://pastebin.com/yHNkNRpfです
手がかりはありますか?
lex - Flex と Lemon パーサー
(適度に)複雑なファイル形式を解析するために、flexとlemonを学ぼうとしています。これまでのところ、文法と lex ファイルがあり、サンプル ファイルを正しく解析していると思います。今のところ、flex でスキャンしたトークン テキストを lemon に渡したいと思っています。
フレックス YYSTYPE は次のように定義されます。
レモントークンの種類は
ただし、レモンに一連のルールがある場合:
出力は次のようになります
それが次のようなものであるべきとき
私の主な解析ループは次のとおりです。
cout 行は、正しい lexCode/yylval の組み合わせを出力しています。
最善の方法は何ですか?うまくいくものが見つかりません。
c - 0 トークンを解析するレモン パーサー
解析に (再入可能) Flex + Lemon を使用すると問題が発生します。ここでは単純な文法とレクサーを使用しています。これを実行するときは、数字の後に EOF トークン (Ctrl-D) を入力します。プリントアウトには次のように表示されます。
最初の行は入力した数値です。理論的には、AST 値は入力したすべての値の合計になるはずです。
編集: Parse() を手動で呼び出すと、正しく実行されます。
atom ::= INT
また、トークンが 0 (停止トークン) の場合でも、lemon はルールを実行しているように見えます。どうしてこれなの?この動作について非常に混乱しており、適切なドキュメントが見つかりません。