2016-03-22 5 views
2

私は、コメントを含む断片の解析について非常に基本的な質問があります。 まず、私たちは私の好きな言語、ピコをインポートします。Rascalでの解析のコメント

import lang::pico::\syntax::Main; 

はその後、我々は、次のコマンドを実行します。予想通り

parse(#Id,"a"); 

は、与えられる:

Id: (Id) `a` 

しかし、

parse(#Id,"a\n%% some comment\n"); 

は解析エラーを返します。

私はここで何が間違っていますか?

答えて

1

複数の問題があります。レイアウトのみの生産とId字句の要素の間に挿入される

  • がされることはありません

    1. Idは、語彙、意味レイアウト(コメント)でのみ文字クラスを持っていないので、レイアウトを挿入する場所。
    2. Idが複数の要素を持つ構文の非終端記号であったとしても、その前または後ではなく、それらの間のコメントを解析します。 Rascal Syntax Definitionssyntaxlexical、とlayoutを参照してくださいとの違いの詳細について

    端末以外でコメントを解析する場合は、非端末向けにstartが変更されています。通常、レイアウトはプロダクション内の要素間にのみ挿入され、開始点は開始点とその前後に挿入されます。

    例はこの文法を取る:

    layout L = [\t\ ]* !>> [\t\ ]; 
    lexical AB = "A" "B"+; 
    syntax CD = "C" "D"+; 
    start syntax EF = "E" "F"+; 
    

    がこの文法に変換されます。

    だから、
    AB = "A" "B"+; 
    CD' = "C" L "D"+; 
    EF' = L "E" L "F"+ L; 
    "B"+ = "B"+ "B" | "B"; 
    "D"+ = "D"+ L "D" | "D"; 
    "F"+ = "F"+ L "F" | "F"; 
    

    、特にあなたは、その周りのレイアウトで文字列を解析したいと思います場合はこれを書くことができます:

    lexical Id = [a-z]+; 
    start syntax P = Id i; 
    layout L = [\ \n\t]*; 
    
    parse(#start[P], "\naap\n").top // parses and returns the P node 
    parse(#start[P], "\naap\n").top.i // parses and returns the Id node 
    parse(P, "\naap"); // parse error at 0 because start wrapper is not around P 
    
  • 関連する問題