Простейшая древовидная грамматика возвращает ошибку разбора, просто изучая - PullRequest
2 голосов
/ 21 июля 2011

Я пытаюсь изучить treetop и брал большую часть кода из https://github.com/survival/lordbishop для анализа имен и собирался строить из этого.

Моя структура немного отличается, потому что я строю ее в рельсах, а не в командной строке 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

Я пытаюсь разобрать 'Джон Смит«Я надеялся просто вернуть слова и пробелы и построить свою логику оттуда, но я застрял даже на этом простом уровне. Любые предложения ??

1 Ответ

3 голосов
/ 22 июля 2011

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
...