0
我希望得到您關於我使用Treetop的經常性問題的建議,我無法不時地修復...。我可能錯過了一些東西。爲什麼空字符串似乎發射而不是自定義節點,有時候,在Treetop語法中?
我懷疑你們中的很多人都有正確的習慣或習慣來解決這個問題。
我一般用樹頂像下面這樣:
- 我在.TT文件中定義我的語法
- 我修改它發出的定製解析樹OBJETS (繼承樹頂::運行:: SyntaxNode )。這些類是在「parsetree.rb」文件中定義的 。
- 這些自定義對象有一個 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
非常感謝。這很清楚。 – JCLL