2012-09-21 4 views
1

Есть ли способ программно сопоставить множественные слова, используя Treetop. Лингвистический камень будет плюрализовать слово, но как его можно вставить обратно в парсер.Соответствие множественным словам в Treetop

Вот пример того, что я пытаюсь сделать:

#!/usr/bin/env ruby 
require 'treetop' 
require 'linguistics' 
include Linguistics::EN 
Treetop.load_from_string DATA.read 

parser = RecipeParser.new 

p parser.parse('cans') 

__END__ 
grammar Recipe 
    rule units 
     unit &{|s| plural(s[0].text_value) } 
    end 
    rule unit 
     'can' 
    end 
end 
+0

Это «Было бы полезно увидеть вашу полную грамматику и то, что вы делаете с ней. Также: вам абсолютно нужно использовать Treetop? Может ли что-то простое, как регулярное выражение, выполнить ваши цели? – pje

ответ

1

В общем, лингвистике камень не произвольные определений множественного числа-они правила не Treetop строк.

Используя смысловые предикатам файл recipe.treetop может определить все действительные особые unit строк в массиве, множественное число их, а затем создать правило, которое сравнивает маркер в вопросе к каждому из этих множественных единиц:

require "linguistics" 

grammar Recipe 
    rule units 
    [a-zA-Z\-]+ &{ |u| 
     Linguistics.use(:en) 
     singular_units = [ "can" ] 

     singular_units. 
     map(&:en). 
     map(&:plural). 
     include?(u[0].text_value) 
    } 
    end 
end 
+1

Это именно то, что я искал. Я собирался посмотреть, смогу ли я сначала разобрать это слово, а затем изучить его окончание, но я предполагаю, что это не имеет смысла для нерегулярных слов множественного числа (гусь и гуси). Единственное, что я, вероятно, захочу, чтобы memoize 'unique_units', так как он будет использоваться каждый раз, когда он попадает в этот узел. –

Смежные вопросы