Frage

Ich habe einfache Grammatik definiert für das Parsen von String und Nummer mit Treetop wie unten.

grammar Simple
    rule value
        number / string
    end 

    rule string
        word space string
        /
        word
    end

    rule word
        [0-9a-zA-Z]+
    end

    rule number
        [1-9] [0-9]*
    end

    rule space
        ' '+
    end
end

Rubin:

parser = SimpleParser.new
parser.parse('123abc wer') # => nil

Ich erwarte, dass der Parser zurück String node , aber aussehen wie die Parser konnte nicht verstehen, die Eingabe. Jede Idee, würde geschätzt.

War es hilfreich?

Lösung

In Treetop (und PEGs im Allgemeinen, tatsächlich) die Wahl Operator bestellt , im Gegensatz zu den meisten anderen Parsing Formalismen.

Also,

rule value
  number / string
end

Sie Treetop sagen, dass Sie bevorzugen number über string.

Ihre Eingabe beginnt mit 1, die Streichhölzer beide number und string (durch word), aber Sie Treetop sagte der number Interpretation bevorzugen, so dass er es als number analysiert. Wenn es um die a im Eingang kommt, ist es nicht mehr Regeln hat gelten, und somit gibt es nichts (nil), weil in Treetop es ein Fehler ist nicht den gesamten Eingangsstrom verbrauchen.

Wenn Sie einfach die Reihenfolge der Wahl umkehren, wird der gesamte Eingang als string anstelle eines number interpretiert:

SyntaxNode+String0 offset=0, "123abc wer" (word,space,string):
  SyntaxNode offset=0, "123abc":
    SyntaxNode offset=0, "1"
    SyntaxNode offset=1, "2"
    SyntaxNode offset=2, "3"
    SyntaxNode offset=3, "a"
    SyntaxNode offset=4, "b"
    SyntaxNode offset=5, "c"
  SyntaxNode offset=6, " ":
    SyntaxNode offset=6, " "
  SyntaxNode offset=7, "wer":
    SyntaxNode offset=7, "w"
    SyntaxNode offset=8, "e"
    SyntaxNode offset=9, "r"

Oder könnten Sie die Reihenfolge halten, wie es ist, aber der value Regel erlauben, mehrfach angepasst werden. Entweder legen Sie eine neue Top-Level-Regel wie folgt aus:

rule values
  value+
end

oder ändern Sie die value Regel wie folgt aus:

rule value
  (number / string)+
end

, die Ihnen eine AST geben grob wie folgt aus:

SyntaxNode offset=0, "123abc wer":
  SyntaxNode+Number0 offset=0, "123":
    SyntaxNode offset=0, "1"
    SyntaxNode offset=1, "23":
      SyntaxNode offset=1, "2"
      SyntaxNode offset=2, "3"
      SyntaxNode+String0 offset=3, "abc wer" (word,space,string):
        SyntaxNode offset=3, "abc":
          SyntaxNode offset=3, "a"
          SyntaxNode offset=4, "b"
      SyntaxNode offset=5, "c"
    SyntaxNode offset=6, " ":
      SyntaxNode offset=6, " "
    SyntaxNode offset=7, "wer":
      SyntaxNode offset=7, "w"
      SyntaxNode offset=8, "e"
      SyntaxNode offset=9, "r"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top