如何在Treetop中嵌入Ruby代码以实现完全自定义的AST生成?

时间:2014-04-03 21:43:55

标签: ruby treetop

我正在尝试使用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)

问题似乎是"声明"的替代方案使用不当,但我不确定。

My 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 个答案:

答案 0 :(得分:0)

就我所知,似乎解析得很好。您发布的代码中存在一些拼写错误。 aa:assign应为a:assignbb:ifStmt应为b:ifStmt'program'应为'prog'

您是否有可能专门展示其余的代码?