树顶基本解析和正则表达式用法

我正在使用ruby Treetop库开发一个脚本,并且正在使用其正则表达式的语法。 首先,许多在其他设置中工作的正则表达式在树梢上不起作用。

这是我的语法:(myline.treetop)

语法MyLine
    规则线
        字符串空白条件
    结束
    规则字符串
         [\ S] *
    结束
    规则空白
         [\ S] *
    结束
    规则条件
         “new”/“old”/“used”
    结束
结束

这是我的用法:(usage.rb)

需要'rubygems'
需要'树梢'
要求'多语言'
要求'myline'

 parser = MyLineParser.new
 p parser.parse(“randomstring new”)

这应该找到新的词肯定,它确实! 现在我不会扩展它,以便它可以找到新的如果输入字符串变为“randomstring anotherstring new yetanother andanother”并且可能在规则条件的正则表达式之前和之后具有任意数量的字符串,后跟空格(包括选项卡)。 换句话说,如果我将任何带有“new”等单词的句子传递给它,它应该能够匹配它。

所以我要说我将语法改为:

规则线
    字符串空白条件空白字符串
结束

然后,它应该能够找到匹配:

  p parser.parse(“randomstring new anotherstring”) 

那么,我必须做些什么来允许在条件之前和之后重复字符串空白? 如果我试着写这个:

规则线
     (字符串空白)*条件(空白字符串)*
结束

,它进入一个无限循环。 如果我用[]替换上面的(),它返回nil一般来说,当我使用上面的时候正则表达式返回一个匹配,但treetop正则表达式不是。 有没有人对如何解决这个问题有任何提示/要点? 此外,由于没有太多关于树梢的文档,并且这些示例要么太简单或太复杂,有没有人知道更全面的树梢文档/指南?

看起来你甚至不需要语法来做你所要求的。 在这种情况下,一个简单的正则表达式就足够了:

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" 

这与树梢无关,与语法无关。 条件规则完全匹配您的字符串规则,因此当您从(string whitespace)*重复到条件时,它是不明确的。 清理你的直线规则,这样你就可以有一个明确的语法,你会没事的。 您可能希望这样做,以便像条件这样的事物/属性被标记为:

 cond:new 

这与字符串规则在词汇上有所不同。