【问题标题】:Treetop basic parsing and regular expression usageTreetop 基本解析和正则表达式使用
【发布时间】:2010-03-08 20:30:29
【问题描述】:

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

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

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

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

需要“红宝石” 需要“树顶” 需要“多语种” 需要'myline' 解析器 = MyLineParser.new p parser.parse("随机字符串新")

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

假设我将语法更改为:

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

那么,它应该能够找到匹配项:

p parser.parse("randomstring new anotherstring")

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

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

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

【问题讨论】:

    标签: ruby regex parsing treetop


    【解决方案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"
    

    【讨论】:

      【解决方案2】:

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

      cond:new
      

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

      【讨论】:

      • 谢谢,我理解你关于无效语法的观点。我没有得到你说的最后一件事 - “像条件这样的事物/属性被标记为:”..你能进一步解释一下吗?
      猜你喜欢
      • 2016-04-27
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多