我正在使用ruby Treetop库开发一个脚本,并且正在使用其正则表达式的语法。首先,许多在其他设置中工作的正则表达式在树梢上不起作用。
这是我的语法:(myline.treetop)
grammar MyLine rule line string whitespace condition end rule string [\S]* end rule whitespace [\s]* end rule condition "new" / "old" / "used" end end
这是我的用法:(usage.rb)
require 'rubygems' require 'treetop' require 'polyglot' require 'myline' parser = MyLineParser.new p parser.parse("randomstring new")
这应该找到新的肯定这个词,它确实!现在我不会扩展它,以便它可以找到新的如果输入字符串变成“randomstring anotherstring new yetanother andanother” 并且在规则条件的正则表达式之前和之后可能有任意数量的字符串后跟空格(包括制表符)。换句话说,如果我将任何带有“new”等单词的句子传递给它,它应该能够匹配它。
所以我想把我的语法改为:
rule line string whitespace condition whitespace string end
然后,它应该能够找到匹配:
p parser.parse("randomstring new anotherstring")
那么,我必须做些什么来允许在条件之前和之后重复字符串空白?如果我试着写这个:
rule line (string whitespace)* condition (whitespace string)* end
,它进入无限循环。如果我用[]替换上面的(),它返回nil 一般来说,当我使用上面的正则表达式返回一个匹配,但treetop正则表达式不。 有没有人对如何解决这个问题有任何提示/要点?另外,由于没有太多关于树梢的文档,而且这些例子要么太简单,要么太复杂,有没有人知道树梢更全面的文档/指南?
答案 0 :(得分:1)
看起来你甚至不需要语法来做你所要求的。在这种情况下,一个简单的正则表达式就足够了:
line.match(/(.*)\s(new|old|used)\s(.*)/)
(例如:http://rubular.com/r/Kl8rUifxeu)
您可以使用以下内容获取包含条件之前和之后的内容的数组:
Regexp.last_match(1).split + Regexp.last_match(3)
用以下方法测试条件:
return "Sweet, it's new!" if Regexp.last_match(2) == "new"
答案 1 :(得分:0)
这与树梢无关,与你的语法有关。条件规则完全与您的字符串规则匹配,因此当您从(string whitespace)*
重复到条件时,它是不明确的。清理你的直线规则,这样你就可以有一个明确的语法,你会没事的。您可能希望这样做,以便像条件这样的事物/属性被标记为:
cond:new
这与字符串规则在词汇上有所区别。