我在Treetop中有两条有效的规则,我认为完美主义者应该是一条且只有一条规则,或者至少是更漂亮的规则:
rule _
crap
/
" "*
end
rule crap
" "* "\\x0D\\x0A"* " "*
end我正在解析一些表达式,这些表达式有时会以"\x0D\x0A“结束。不是"\r\n“而是"\x0D\x0A”有些东西在某种程度上被双重转义了。说来话长。
这条规则行得通,但它很丑陋,而且让我很困扰。我试过这个:
rule _
" "* "\\x0D\\x0A"* " "*
/
" "*
end这导致了
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'理想情况下,我会写一些类似这样的东西:
rule _
(" " | "\\x0D\\x0A")*
end但这是行不通的,当我们这样做的时候,我也发现每个规则不能只有一个*:
rule _
" "*
/
"\n"*
end将与“”匹配,但不会匹配\n。
发布于 2011-07-13 20:55:32
我看到您使用了三种不同的OR字符:/、|和\ (其中只有第一个字符表示OR)。
这可以很好地工作:
grammar Language
rule crap
(" " / "\\x0D\\x0A")* {
def value
text_value
end
}
end
end#!/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 + '<'打印:
> \x0D\x0A \x0D\x0A <发布于 2015-05-06 10:39:24
你说“我还发现每个规则不能只有一个*”(你的意思是:你可以拥有),“它将匹配”",但永远不会“。
当然,当它匹配零个空格字符时,规则就成功了。你可以直接用+来代替:
rule _
" "+
/
"\n"*
end如果要匹配任意数量的空格或换行符,也可以将空格字符括起来:
rule _
(" " / "\n")*
end您的错误“类/模块名称必须是常量”是因为规则名称被用作模块名称的前缀,以包含附加到您的规则的任何方法。模块名称不能以下划线开头,因此不能在名称以下划线开头的规则中使用方法。
https://stackoverflow.com/questions/6677030
复制相似问题