2

我正在使用 ruby​​ Treetop 库开发一个脚本,并且在使用它的正则表达式语法时遇到问题。首先,许多在其他设置中工作的正则表达式在树顶中的工作方式不同。

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

语法 MyLine
    规则线
        字符串空白条件
    结尾
    规则字符串
        [\S]*
    结尾
    规则空格
        [\s]*
    结尾
    规则条件
        “新”/“旧”/“二手”
    结尾
结尾

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

需要“红宝石”
需要“树顶”
需要“多语种”
需要'myline'

解析器 = MyLineParser.new
p parser.parse("随机字符串新")

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

因此,假设我将语法更改为:

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

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

p parser.parse("randomstring new anotherstring")

那么,我该怎么做才能让字符串空格在条件之前和之后重复呢?如果我尝试写这个:

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

,它进入一个无限循环。如果我将上面的 () 替换为 [],它会返回 nil 通常,当我使用上述内容时,正则表达式会返回匹配项,但树顶正则表达式不会。有人对如何解决这个问题有任何提示/要点吗?另外,由于树顶的文档不多,并且示例太琐碎或太复杂,有没有人知道更详尽的树顶文档/指南?

4

2 回答 2

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"
于 2010-03-15T11:23:11.887 回答
0

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

cond:new

这在词法上与字符串规则不同。

于 2010-03-09T09:53:48.507 回答