我正在尝试学习树梢,并且正在使用https://github.com/survival/lordbishop中的大部分代码来解析名称,并且将从中构建。
我的结构有点不同,因为我在rails中构建它,而不是ruby命令行。
当我运行一个非常简单的解析时,我在空格中返回一个解析错误(这应该是我语法中较简单的事情之一。我做错了什么?
我的代码非常简单,在我的模型中
require 'treetop' require 'polyglot' require 'grammars/name' class Name def self.parse(data) parser = FullNameParser.new tree = parser.parse(data) if tree.nil? return "Parse error at offset: #{parser.index}" end result_hash = {} tree.value.each do |node| result_hash[node[0] = node[1].strip if node.is_a?(Array) && !node[1].blank? end return result_hash end end
我已将大部分语法删除为只获取单词和空格
grammar FullName rule word [^\s]+ { def value text_value end } end rule s [\s]+ { def value "" end } end end
我正在尝试解析'john smith',我希望能够从那里找回单词和空格并构建我的逻辑,但我仍然坚持这个简单的级别。有什么建议??
答案 0 :(得分:3)
AFAIK,treetop开始使用语法中的第一条规则进行解析(在您的情况下为规则word
!)。现在,如果您输入的是'John Smith'
(即:word
,s
,word
),它会在首次匹配规则word
后停止解析。由于s
与word
不匹配,遇到第一个s
时会产生错误。
您需要在语法顶部添加一条描述整个名称的规则:这是一个单词,后跟一个空格后跟一个单词等。
grammar FullName
rule name
word (s word)* {
def value
text_value
end
}
end
rule word
[^\s]+ {
def value
text_value
end
}
end
rule s
[\s]+ {
def value
text_value
end
}
end
end
使用脚本进行快速测试:
#!/usr/bin/env ruby
require 'rubygems'
require 'treetop'
require 'polyglot'
require 'FullName'
parser = FullNameParser.new
name = parser.parse('John Smith').value
print name
将打印:
John Smith