使用如下定义的语法,为什么在尝试访问由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
答案 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
到控制台。