2

Treetop で表現された文法を単純化し、カスタム ノードを使用して、パーサーの出力を AST にフィルター処理しようとしています。

grammar Elem

 rule top
   lpar 'top' space 
      args_:(lpar 'args' space ((ident / number) space?)* rpar)  space? 
   rpar <Top>
 end

 rule ident
   [a-zA-Z] [a-zA-Z0-9_]* <Ident>
 end

 rule number
   [0-9]+ <Number>
 end

 rule space
  [\s]+
 end

 rule lpar
  space? '(' space? 
 end

 rule rpar
  space? ')' space? 
 end
end

基本的に、次の例を解析できます。

(top (args foo bar 42))

カスタム ノードはすべてTreetop::Runtime::SyntaxNodeを継承します

ここで、Treetop によって生成された解析ツリーを AST にフィルター処理する必要があります。

ここで説明されている戦略に従いますが、成功しませんでした: 私の AST はただ空です...

私のコンパイラドライバは次のとおりです。

require 'treetop'
require 'pp'

require_relative 'elem'
require_relative 'node_extension'

class ElemCompiler
  def initialize
    @parser=ElemParser.new
  end

  def compile filename
    puts "==> compiling #{filename}"
    @ast=parse(filename)
    puts "==> AST in memory. Good."
  end

  def parse filename
    pp tree=@parser.parse(IO.read(filename))
    pp clean(tree)
  end

  private

  def clean(root_node)
    return if(root_node.elements.nil?)
    pp root_node.elements.collect {|node| node.class.name =="Treetop::Runtime::SyntaxNode" }
    pp root_node.elements.delete_if{|node| node.class.name == "Treetop::Runtime::SyntaxNode" }
    root_node.elements.each {|node| clean(node) }
  end


end

 compiler=ElemCompiler.new.parse ARGV[0]

何が欠けていますか?

4

1 に答える 1