1

私のTreetopには、完璧主義者が1つだけのルール、または少なくとももっと美しいものでなければならないと信じている、この実用的なルールのペアがあります。

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

しかし、それは機能しません。私たちがそれに取り組んでいる間、ルールごとに1つだけ*を持つことはできないことも発見しました。

rule _
  " "*
  /
  "\n"*
end

これは""と一致しますが、\nにはなりません。

4

2 に答える 2

1

あなたは、「ルールごとに * を 1 つしか使用できないことも発見しました」(つまり、使用できます)、「それは " " に一致しますが、\n には一致しません」と述べました。

もちろん; ゼロ スペース文字に一致する場合、ルールは成功します。代わりに + を使用できます。

rule _
  " "+
  /
  "\n"*
end

任意の数のスペースまたは改行文字に一致させたい場合は、スペース文字を括弧で囲むこともできます。

rule _
  (" " / "\n")*
end

「クラス/モジュール名は定数でなければなりません」というエラーは、ルール名がモジュール名のプレフィックスとして使用され、ルールに添付されたメソッドが含まれているためです。モジュール名はアンダースコアで始まらない場合があるため、名前がアンダースコアで始まるルールではメソッドを使用できません。

于 2015-05-06T02:39:24.223 に答える
1

OR3 つの異なる文字を使用していることがわかります: /|および\(そのうち最初の意味のみ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   <
于 2011-07-13T12:55:31.923 に答える