在树顶中访问关联方法与节点

时间:2011-06-06 16:34:54

标签: ruby parsing dsl treetop

使用如下定义的语法,为什么在尝试访问由val创建的节点的key方法时仍然会出现错误?

错误消息是

(eval):168:in `val': undefined local variable or method `key'
for #<Treetop::Runtime::SyntaxNode:0x00000101b1e160> (NameError)

语法是

grammar Command
  rule create_command
    'create' space pair {
      def val
        pair.val
      end
    }
  end

  rule pair
    key space? '=' space? '"' value '"' {
      def val
        { key.val => value.val }
      end
    }
  end

  rule key
    [A-Za-z_] [A-Za-z0-9_]* {
      def val
        key.to_sym
      end
    }
  end

  rule value
    ('\\"' / [^"])+ {
      def val
        value.to_s
      end
    }
  end

  rule space
    [ \t]+
  end
end

测试代码是

require 'treetop'
Treetop.load "command"
p = CommandParser.new
r = p.parse 'create name = "foobar"'
p r.val

1 个答案:

答案 0 :(得分:1)

您可以通过text_value访问规则本身的内容。语法:

grammar Command

  rule create_command
    'create' space pair {
      def val
        pair.val
      end
    }
  end

  rule pair
    key space? '=' space? '"' value '"' {
      def val
        { key.val => value.val }
      end
    }
  end

  rule key
    [A-Za-z_] [A-Za-z0-9_]* {
      def val
        text_value
      end
    }
  end

  rule value
    ('\\"' / [^"])+ {
      def val
        text_value
      end
    }
  end

  rule space
    [ \t]+
  end

end

可以用以下方法测试:

require 'rubygems'
require 'treetop'
require 'polyglot'
require 'command'

parser = CommandParser.new
pair = parser.parse('create name = "foobar"').val
print pair['name'], "\n"

并将打印:

foobar

到控制台。