Как встроить код Ruby в Treetop для полностью настраиваемой генерации AST?

Я пытаюсь написать парсер, используя Treetop, для игрушечного языка, который просто выглядит так:

prog test is
  a = b;
  if c then
    d=f;
  end; 
end

Моя грамматика кажется нормальной, но когда я пытаюсь встроить код Ruby в грамматику, я получаю странные сообщения, которые не могу понять.

22:in `ruby_source_from_string': Expected one of #, .., &, !, ~, ', ", [, ., rule, end, ( at line 21, column 5 (byte 312) after grammar Gram     (RuntimeError)

Кажется, что проблема заключается в неправильном использовании альтернативы для "заявления", но я не уверен.

Моя Treetop грамматика выглядит так:

grammar Gram    

 rule program
   'program' s id:identifier s 'is' s b:block 'end' {
     def ast
       Program.new(id.ast,b.ast)
     end
   }
 end

 rule block
    s? st:(statement)* s? {
     def ast
        Block.new( *st.elements.collect{|e| e.ast} )
     end
   }
 end

 rule statement
     aa:assign 
    {
     def ast
        a.ast
     end
     }
   / bb:ifStmt 
    {
     def ast
        b.ast
     end
   }
 end

 rule assign 
   i1:identifier s? '=' s? i2:identifier s? ';' s? {
     def ast
       Assign.new(i1.ast,i2.ast)
     end
   }
 end

 rule ifStmt
   s? 'if' s i:identifier s 'then' s b:block s? 'end' s? ';'  {
     def ast
         IfStmt.new(i.ast,b.ast)
     end
   }
 end

 rule identifier
   [a-zA-Z]+  {
     def ast
       Identifier.new(text_value)
     end
   }
 end

 rule s
   [\s]+
 end

end

Может ли эксперт взглянуть на это?

1 ответ

Насколько я могу судить, кажется, что разбирается нормально. В опубликованном вами коде было несколько опечаток. aa:assign должно быть a:assign, bb:ifStmt должно быть b:ifStmt, а также 'program' должно быть 'prog' на вершине.

Есть ли шанс, что вы сможете показать остальную часть своего кода, особенно классы?

Другие вопросы по тегам