2

我正在尝试学习树顶,并且正在从https://github.com/survival/lordbishop获取大部分代码来解析名称,并将以此构建。

我的结构有点不同,因为我是在 Rails 中构建它,而不是 ruby​​ 命令行。

当我运行一个非常简单的解析时,我在一个空格上返回了一个解析错误(这应该是我语法中更简单的事情之一。我做错了什么?

在我的模型中,我的代码相当简单

需要“树顶”
需要“多语种”

需要'语法/名称'

班级名称
      def self.parse(数据)
           parser = FullNameParser.new
           树 = parser.parse(数据)
           如果tree.nil?
              返回“在偏移量处解析错误:#{parser.index}”
           结尾
           结果哈希 = {}
           tree.value.each 做 |node|
              result_hash[node[0] = node[1].strip if node.is_a?(Array) && !node[1].blank?
           结尾
           返回result_hash
      结尾
结尾

我已经将大部分语法剥离为只获取单词和空格

语法全名
    规则词
        [^\s]+ {
        默认值
            文本值
        结尾
        }
    结尾

    规则
        [\s]+ {
        默认值
            “”
        结尾
        }
    结尾
结尾

我正在尝试解析'john smith',我希望只取回单词和空格并从那里建立我的逻辑,但我什至被困在这个简单的水平上。有什么建议么??

4

1 回答 1

3

AFAIK,treetop 开始解析语法中的第一条规则(规则word,在你的情况下!)。现在,如果您输入的是'John Smith'(即:word,,, ) s,它会在第一次word匹配规则后停止解析。并在遇到第一个因为不匹配word时产生错误。swords

您需要在语法顶部添加一条规则来描述整个名称:即一个单词,后跟一个空格,然后是一个单词,等等。

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
于 2011-07-22T11:55:06.087 回答