analyseur rubis Treetop - n'a pas pu analyser Ordonné Choix
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.
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"