2013-09-22 152 views
0

Treetop似乎忽略了第一個之後的更多規則,並且無法解析與語法文件上的第一條規則不匹配的任何內容。 我已經嘗試交換規則的順序,但仍然只考慮第一個規則。Treetop忽略語法規則

# grammar_pov.treetop 
grammar Pov 
    rule numeric 
     '-'? [0-9]+ ('.' [0-9]+)? <::PovFabric::Nodes::NumericLiteral> 
    end 
    rule comma 
     ',' 
    end 
    rule space 
     [\s]+ 
    end 
end 

此語法文件相匹配的所有整數和浮點數,但不匹配「123,456」或「123456」 解析器FAILURE_REASON屬性說,這種「預期 - 位於第1行,第1列(字節1)後'

我錯過了什麼?

回答

0

和Jörg一樣,你需要在語法中使用你的commaspace規則。我在下面建立了一個我認爲你正在努力完成的簡單例子。它應與"100""1,000""1,000,000"

如果你看看數字規則,首先我測試減號'-'?,然後我考一至三個數字,然後我測試的零個或多個組合comma和三位數字。

require 'treetop' 
Treetop.load_from_string DATA.read 

parser = PovParser.new 

p parser.parse('1,000,000') 

__END__ 
grammar Pov 
    rule numeric 
     '-'? digit 1..3 (comma space* (digit 3..3))* 
    end 

    rule digit 
     [0-9] 
    end 

    rule comma 
     ',' 
    end 

    rule space 
     [\s] 
    end 
end 
+0

這是一個很好的例子,謝謝! –

+0

沒問題,很高興我能幫忙:) –

1

您的commaspace規則不會在任何地方使用。所以,他們只是無用的代碼。

+0

你能詳細點嗎?逗號規則不應該匹配'123,456'和'123,456'嗎? –

+0

不,「逗號」規則匹配「,」,而沒有別的。但無論如何,這完全無關緊要,因爲這個規則甚至沒有在任何地方使用過。這與定義一個子程序並且永遠不會調用它是一樣的。 –