2017-10-06 13 views
0

おはよう皆、Treetopパーサ:スペースを扱う方法は?

は、私は現在、いくつかの基本的なRubyの文法を記述しようとしているが、私は今、解析スペースで立ち往生していますか? x = 1 + 1、
を処理できますが、x = 1 + 1を解析できません。
どのように解析することができますか?
すべての端末の後に十分なスペースを追加しようとしました。 それを解析することはできません。無し。..... どうすれば修正できますか? ありがとう、素敵な一日を。

 

grammar Test 
    rule main 
    s assign 
    end 

    rule assign 
    name:[a-z]+ s '=' s expression s 
    { 
     def to_ast 
     Assign.new(name.text_value.to_sym, expression.to_ast) 
     end 
    } 
    end 


    rule expression 
    add 
    end 


    rule add 
    left:brackets s '+' s right:add s 
    { 
     def to_ast 
     Add.new(left.to_ast, right.to_ast) 
     end 
    } 
    /
    minus 
    end 

    rule minus 
    left:brackets s '-' s right:minus s 
    { 
     def to_ast 
     Minus.new(left.to_ast, right.to_ast) 
     end 
    } 
    /
    brackets 
    end 

    rule brackets 
     '(' s expression ')' s 
     { 
     def to_ast 
      expression.to_ast 
     end 
    } 
    /
    term 
    end 

    rule term 
    number/variable 
    end 

    rule number 
    [0-9]+ s 
    { 
     def to_ast 
     Number.new(text_value.to_i) 
     end 
    } 
    end 

    rule variable 
    [a-z]+ s 
    { 
     def to_ast 
     Variable.new(text_value.to_sym) 
     end 
    } 
    end 

    rule newline 
    s "\n"+ s 
    end 

    rule s 
    [ \t]* 
    end 
end 
 

このコードは 問題解決に動作します!!!!

答えて

2

スペースルールを定義するだけでは十分ではありません。スペースルールがあればどこでも使用できます。これは頻繁に発生するため、通常、必須のスペースには短いルール名Sを使用し、オプションのスペースには小文字のバージョンsを使用します。

次に、原則として、私は一番上のルールでオプションのスペースをスキップし、スペースの後ろに続くすべてのターミナルの後にもう一度スキップします。ここにある端末は文字列、文字セットなどですので、最初にvariablebooleannumberの{}ブロックの前に、 '='、 ' - '、 '+'リテラルの後にコールを追加して、assignの先頭スペースをスキップするにはsのルールに従います。

このポリシーは私にとってはうまくいきます。最小のスペースを持つテストケースと、最大限のスペースを持つ別のケース(すべての可能な場所)を持つことをお勧めします。

+0

私はすべての端末の後に十分なスペースを追加しましたが、それは何も表示しません.......... T_T – DoubleMay

+0

あなたは私が言ったことをしていません。すべてのルールの開始時、またはスペースをスキップすることによって終わる 'expression'のようなルールの呼び出しの後に' space 'は必要ありません。最初に必要なルールは 'main'だけです。しかし、あなたは '' + ''のようなリテラルの中にスペースがあるので、あなたはまだ失敗しています。それらのスペースを削除します。 '![a-z]'を 'true'と' false'の直後に置かなければなりません。それ以降のスペースをスキップします。 – cliffordheath

+0

聖なるイエス様、それは働きます!!!!!!!!!ありがとうございます!!!!!!!!!!!!! – DoubleMay

関連する問題