Question

J'ai défini la grammaire simple pour la chaîne et l'analyse syntaxique numéro à l'aide arboricole comme ci-dessous.

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

Ruby:

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

Je me attends à l'analyseur pour revenir string noeud mais ressembler à l'analyseur ne pouvait pas comprendre l'entrée. Toute idée serait appréciée.

Était-ce utile?

La solution

Dans arboricole (et en général PEGs, en fait) l'opérateur de choix est commandé , contrairement à la plupart des autres formalismes d'analyse syntaxique.

Ainsi,

rule value
  number / string
end

vous dites que vous arboricole préférez number sur string.

Vos mises en entrée avec 1, qui correspond à à la fois number et string (par word), mais vous dit arboricole de préférer l'interprétation number, il comme il parse number. En ce qui concerne la a dans l'entrée, il a des règles pas plus à appliquer, et donc il ne retourne rien (nil), parce que dans arboricole est une erreur de ne pas consommer le flux d'entrée entier.

Si vous inversez l'ordre du choix, l'entrée entière sera interprétée comme une string au lieu d'un number:

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"

Ou, vous pouvez garder l'ordre tel qu'il est, mais permettent la règle de value à apparier plusieurs fois. Soit insérer une nouvelle règle de niveau supérieur comme celui-ci:

rule values
  value+
end

ou modifier la règle de value comme ceci:

rule value
  (number / string)+
end

Ce qui vous donnera un AST à peu près comme ceci:

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"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top