有没有办法使用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 :(得分:1)
一般来说,语言学宝石不能复数任意树顶规则定义 - 它们不是字符串。
使用语义谓词,您的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