私はチュートリアルのExpサンプルを見ています。構文のさまざまな部分でレイアウトを制御する方法は?
レイアウトを条件付きで制御できますか?そうでない場合は括弧で囲まれた式
- 改行、無関係な改行が例えばステートメント/発現ターミネーター
ある: (1 + \ nは、例えば、Pythonの式は、検討3)
は有効な式ですが、 1 + \ nは3
ではありません。
もしそうでなければ、同じ結果を達成する最も簡単な方法は、私の文法で改行を振りかけるのですか?
私はチュートリアルのExpサンプルを見ています。構文のさまざまな部分でレイアウトを制御する方法は?
レイアウトを条件付きで制御できますか?そうでない場合は括弧で囲まれた式
ある: (1 + \ nは、例えば、Pythonの式は、検討3)
は有効な式ですが、 1 + \ nは3
ではありません。
もしそうでなければ、同じ結果を達成する最も簡単な方法は、私の文法で改行を振りかけるのですか?
はい、それは可能です:
A
とB
間syntax
ルールにlayout
非終端L
を使用する場合:その後、構文NY =「foo」というALB「バー」、ラスカルA
とL
またはあなたがそうのように(最初のポイントでの使用のために)自動的にすべての時間を挿入されていない、あなたの文法にレイアウト非端子を追加することができますL
間と
B
の間でより多くのレイアウト非端子を追加しません。
layout NoNewLineLayout = @manual [\t\ ]*;
したがって、改行を振りかざすのではなく、文法にNoNewLineLayoutシンボルのインスタンスを振りかざす必要があります。私は通常、NNLのような短い名前を使用して、これを侵害しないようにします。この回避策を使用して、Javascriptの文法や他のレイアウトに敏感な言語を試しました。一般的に、それは完璧ではないと我々はより洗練されたソリューションを働いているが、http://dl.acm.org/citation.cfm?id=2814242プレビューを参照してください。
もう1つ柔軟性の低いソリューションは、layout
定義のスコープ(モジュールスコープ)を使用することです。現在のモジュールのレイアウト定義は、インポートされたレイアウト定義よりも優先されます。このようにして、非端末がどんなルールで編成されているかに影響を与えることができる。これは、異なる慣習規約などを持つかもしれない他の言語に言語を埋め込むときに大抵便利です。現在のユースケースでは、私はそれをアドバイスしません。
返信いただきありがとうございます。私はレイアウト定義の範囲を使用することを考えました。 expr.rscを使用して、改行レイアウトと括弧で囲まれた式を追加したexpr_w.rscを使用して、最終的な構文を2つから作成しましたが、動作させることができませんでした。私は他の提案を試みます。 – tpso
(申し訳ありませんが、長さを分割しなければなりませんでした)最後に、別の可能性として、レイアウトに非端末を含めることができます: "\ n"が括弧の外に含まれている場合、解析に失敗しますか? – tpso
ラスカル文法には副作用がないため、行えません。ただし、後解析フィルタを記述することもできます。http://tutor.rascal-mpl.org/Rascal/Rascal.html#/Rascal/Declarations/SyntaxDefinition/Action/Action.htmlを参照してください。これらは、ツリーを構築するときに適用される解析木のパターンであり、構築時にそれを書き換えたり、削除したい代替案をフィルタリングしたりすることができます。文法を修正するよりも遅く、フィルタコードによっては遅すぎることもあります。通常は理解するのも難しいです。 AfroozehとIzmaylovaのデータ依存型ソリューションが好きです。追加する予定です。 – jurgenv