Я хотел бы получить ваш совет относительно повторяющейся проблемы, связанной с использованием Treetop, что я не могу исправить ... время от времени. Вероятно, я что-то пропустил.Почему пустая строка кажется испущенной вместо пользовательского узла, иногда в грамматике Treetop?
Я подозреваю, что многие из вас имеют правильную идиому или привычки решать это.
Я обычно использую Treetop как следующий:
- Я определяю свою грамматику в файле .TT
- я могу изменить его испускать пользовательские дерево разбора OBJETS (которые наследуют Treetop :: RUNTIME :: 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