rebol Parse règle avec Compose / profondeur et ajouter la fonction
-
12-09-2019 - |
Question
Cela fonctionne très bien (grâce à la suggestion de Sunanda Comment puis-je analyser [a / b] erreur de syntaxe dans Rebol ):?
attribute: copy []
class: copy []
definition-rule: compose/deep [some [set class word! 'is 'defined 'by
[some [copy attribute to (to-lit-word "/") thru (to-lit-word "/") ]]
copy attribute to end]]
parse [Customer is defined by First Name / Last Name / Email] definition-rule
mais je dois maintenant ajouter quelques instructions append (joindre la classe de sortie) et il ne fonctionne pas plus:
attribute: copy []
class: copy []
definition-rule: compose/deep [some [set class word! (append output class) 'is 'defined 'by
[some [copy attribute to (to-lit-word "/") thru (to-lit-word "/") ]]
copy attribute to end]]
parse [Customer is defined by First Name / Last Name / Email] definition-rule
La solution
Le problème ici est que le Nouveau est de manger toutes les expressions entre parenthèses. Vous êtes heureux pour qu'il puisse manger les (à mot allumé « / ») , mais vous ne voulez pas sérieusement manger (ajouter la classe de sortie) parce que c'est destiné à l'analyse syntaxique dialecte.
Il y a probablement une approche plus intelligente, mais cela devrait fonctionner: enlever le en faisant le mot allumé de travail en dehors de la règle d'analyse syntaxique Nouveau ...
attribute: copy []
class: copy []
output: copy ""
fs: to-lit-word "/" ;; define a forward slash lit-word
definition-rule: [
some [set class word! (append output class) 'is 'defined 'by [
some [copy attribute to fs thru fs]
]
copy attribute to end]
]
parse [Customer is defined by First Name / Last Name / Email] definition-rule
== true
Je ne suis pas tout à fait sûr de ce que vous essayez de faire avec ce code, mais que vous voulez extraire l'ensemble des attributs à la fin, il faut considérer ce changement:
attribute: copy []
attributes: copy []
class: copy []
output: copy ""
fs: to-lit-word "/" ;; define a forward slash lit-word
definition-rule: [
some [set class word! (append output class) 'is 'defined 'by [
some [copy attribute to fs thru fs (append/only attributes attribute)]
]
copy attribute to end (append/only attributes attribute)]
]
parse [Customer is defined by First Name / Last Name / Email] definition-rule
print ["==" class mold attributes]
== Customer [[First Name] [Last Name] [Email]]
Autres conseils
republier code commentaire car il est illisible, ce que je voulais faire était ce exactement:
attribute: copy []
class: copy []
fs: to-lit-word "/"
output: copy ""
definition-rule: [
some [set class word! (append output join class "|") 'is 'defined 'by [
some [copy attribute to fs thru fs (append output join attribute ";")]
]
copy attribute to end (append output attribute)]
]
parse [Customer is defined by First Name / Last Name / Email] definition-rule
probe output