最简单的树梢语法正在返回一个解析错误,只是学习

时间:2011-07-21 19:26:33

标签: ruby treetop

我正在尝试学习树梢,并且正在使用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',我希望能够从那里找回单词和空格并构建我的逻辑,但我仍然坚持这个简单的级别。有什么建议??

1 个答案:

答案 0 :(得分:3)

AFAIK,treetop开始使用语法中的第一条规则进行解析(在您的情况下为规则word!)。现在,如果您输入的是'John Smith'(即:wordsword),它会在首次匹配规则word后停止解析。由于sword不匹配,遇到第一个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