2015-05-07 44 views
0

我希望得到您關於我使用Treetop的經常性問題的建議,我無法不時地修復...。我可能錯過了一些東西。爲什麼空字符串似乎發射而不是自定義節點,有時候,在Treetop語法中?

我懷疑你們中的很多人都有正確的習慣或習慣來解決這個問題。

我一般用樹頂像下面這樣:

  1. 我在.TT文件中定義我的語法
  2. 我修改它發出的定製解析樹OBJETS (繼承樹頂::運行:: SyntaxNode )。這些類是在「parsetree.rb」文件中定義的 。
  3. 這些自定義對象有一個 to_ast將它們遞歸爲「純」的方法 Treetop無關的類(構成我的最終AST)。我有 兩個單獨的模塊(ParseTree & AST)。

不過,我打了一個經典的錯誤信息,我一般不能修復:

parsetree.rb:380:in `to_ast': undefined method `to_ast' for SyntaxNode 
offset=149, "":Treetop::Runtime::SyntaxNode (NoMethodError) 

我疑惑這裏是因爲一個空字符串「」似乎發出,而不是我的自定義節點之一。

在這個例子中,在這條線380我有以下代碼(它是關於一個有限狀態機)

# in parsetree.rb 
class Next < Tree 
     def to_ast 
     ret=Ldl::Ast::Next.new 
     ret.name=ns.to_ast 
     if cond 
      ret.condition=cond.c.to_ast 
     end 
     ret.actions=acts.to_ast # <==== line 380 
     ret 
     end 
    end 

class NextActions < Tree 
     def to_ast 
     eqs.elements.collect{|eq| eq.to_ast} 
     end 
    end 

而我的片由誤差有關的語法是:

rule nextstate 
    space? 'next' space ns:identifier space? cond:('?' space? c:expression)? space 
    acts:next_actions? <Ldl::ParseTree::Next> 
end 

rule next_actions 
    space? eqs:equation+ space 'end' space <Ldl::ParseTree::NextActions> 
end 

回答

1

您的問題與可選表達式的行爲有關。

行爲:next_actions是可選的。如果此可選元素在輸入中不匹配,則不會得到NextActions節點,而是一個epsilon。你應該檢測說喜歡的東西:可選:

ret.actions = acts.empty? ? [] : acts.to_ast 

因爲標籤COND命名的順序可能會出現同樣的問題。如果這個序列不存在於輸入中,那麼它沒有內容「c」。在這種情況下,「cond」仍將被定義,並且「if」語句將爲true,但cond.c.to_ast將失敗。

簡答:當你使用一個可選的表達式時,你應該給它加上標籤並測試標籤是否爲空?在嘗試使用內容之前。

+0

非常感謝。這很清楚。 – JCLL

相關問題