2017-10-06 53 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作爲可選空格。

然後,作爲一個原則,我首先跳過可選空間,然後在每個可以跟着空格的終端之後再跳過可選空間。這裏的終端是字符串,字符集等。因此,在assign的開頭,以及variable,boolean,number的{}塊之前,以及在'=',' - '和'+'文字後加上一個呼叫規則s跳過任何空格。

此政策適用於我。有一個最小空間的測試用例和另一個具有最大空間(所有可能的地方)的情況是一個好主意。

+0

我已經在每個終端後添加足夠的空間,但它顯示無.......... T_T – DoubleMay

+0

你還沒有做我說的。在每個規則的開始處,或者在調用像'expression'這樣以跳過空格結束的規則之後,你不需要'space',在開始時需要它的唯一規則是'main'。但是你仍然失敗,因爲你的''+''和類似的文字中有空格。刪除這些空格。你還必須在'true'和'false'之後直接放置'![a-z]';之後跳過空格。 – cliffordheath

+0

神聖的耶穌,它的作品!!!!!!!!!非常感謝!!!!!!!!!!!!! – DoubleMay