首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我相信这应该是Treetop中的一条规则

我相信这应该是Treetop中的一条规则
EN

Stack Overflow用户
提问于 2011-07-13 17:49:19
回答 2查看 138关注 0票数 1

我在Treetop中有两条有效的规则,我认为完美主义者应该是一条且只有一条规则,或者至少是更漂亮的规则:

代码语言:javascript
复制
rule _
  crap
  /
  " "*
end

rule crap
  " "* "\\x0D\\x0A"* " "*
end

我正在解析一些表达式,这些表达式有时会以"\x0D\x0A“结束。不是"\r\n“而是"\x0D\x0A”有些东西在某种程度上被双重转义了。说来话长。

这条规则行得通,但它很丑陋,而且让我很困扰。我试过这个:

代码语言:javascript
复制
rule _
  " "* "\\x0D\\x0A"* " "*
  /
  " "*
end

这导致了

代码语言:javascript
复制
SyntaxError: (eval):1276:in `load_from_string': compile error
(eval):1161: class/module name must be CONSTANT
    from /.../gems/treetop-1.4.9/lib/treetop/compiler/grammar_compiler.rb:42:in `load_from_string'
    from /.../gems/treetop-1.4.9/lib/treetop/compiler/grammar_compiler.rb:35:in `load'
    from /.../gems/treetop-1.4.9/lib/treetop/compiler/grammar_compiler.rb:32:in `open'
    from /.../gems/treetop-1.4.9/lib/treetop/compiler/grammar_compiler.rb:32:in `load'

理想情况下,我会写一些类似这样的东西:

代码语言:javascript
复制
rule _
  (" " | "\\x0D\\x0A")*
end

但这是行不通的,当我们这样做的时候,我也发现每个规则不能只有一个*:

代码语言:javascript
复制
rule _
  " "*
  /
  "\n"*
end

将与“”匹配,但不会匹配\n。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-13 20:55:32

我看到您使用了三种不同的OR字符:/|\ (其中只有第一个字符表示OR)。

这可以很好地工作:

代码语言:javascript
复制
grammar Language

  rule crap
    (" " / "\\x0D\\x0A")* {
      def value
        text_value    
      end
    }
  end

end
代码语言:javascript
复制
#!/usr/bin/env ruby

require 'rubygems'
require 'treetop'
require 'polyglot'
require 'language'

parser = LanguageParser.new
value = parser.parse(' \\x0D\\x0A   \\x0D\\x0A   ').value
print '>' + value + '<'

打印:

代码语言:javascript
复制
> \x0D\x0A   \x0D\x0A   <
票数 1
EN

Stack Overflow用户

发布于 2015-05-06 10:39:24

你说“我还发现每个规则不能只有一个*”(你的意思是:你可以拥有),“它将匹配”",但永远不会“。

当然,当它匹配零个空格字符时,规则就成功了。你可以直接用+来代替:

代码语言:javascript
复制
rule _
  " "+
  /
  "\n"*
end

如果要匹配任意数量的空格或换行符,也可以将空格字符括起来:

代码语言:javascript
复制
rule _
  (" " / "\n")*
end

您的错误“类/模块名称必须是常量”是因为规则名称被用作模块名称的前缀,以包含附加到您的规则的任何方法。模块名称不能以下划线开头,因此不能在名称以下划线开头的规则中使用方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6677030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档