2

私は次のツリートップ文法を持っています:

grammar TestGrammar

    rule body
        text / expression
    end 

    rule text
        not_delimiter*
    end 

    rule expression
        delimiter text delimiter
    end 

    rule delimiter
        '$' 
    end 

    rule not_delimiter
        !delimiter
    end 

end

「hello world $test$」などの式を解析しようとすると、スクリプトが無限ループに入ります。
問題は not_delimiter ルールに起因するようです。削除すると式が解析されるためです。

この文法の問題点は何ですか?

前もって感謝します。

4

1 に答える 1

1

問題は、一致させようとしている場所にあるようです。

rule text
    not_delimiter*
end

*も一致しないので、一致する可能性が[^$]*あります。これが無限ループの原因だと思います。

bodiesまた、開始ルールで複数一致する必要があります。一致しない場合は、ルールまたはルールのnilいずれかのみに一致し、両方には一致しないため、が返されます。textexpression

rule bodies
   body+
end

これは解析します:

require 'treetop'
Treetop.load_from_string DATA.read

parser = TestGrammarParser.new

p parser.parse "hello world $test$"

__END__
grammar TestGrammar
   rule bodies
      body+
   end
   rule body
      expression / text
   end
   rule expression
      delimiter text delimiter
   end
   rule text
      not_delimiter+
   end
   rule not_delimiter
      [^$]
   end
   rule delimiter
      '$'
   end
end
于 2012-10-20T22:50:30.043 に答える