web-dev-qa-db-fra.com

Quelle est la vraie différence entre un jeton et une règle?

J'étais attiré par Raku en raison de ses grammaires intégrées et je me suis dit que je jouerais avec et j'écrirais un simple analyseur d'adresses e-mail, seul problème: je ne pouvais pas le faire fonctionner.

J'ai essayé d'innombrables itérations avant d'atterrir sur quelque chose qui fonctionne réellement, et j'ai du mal à comprendre pourquoi.

Tout cela se résumait à changer token en rule.

Voici mon exemple de code:

grammar Email {
  token TOP { <name> '@' [<subdomain> '.']* <domain> '.' <tld> }  
  token name { \w+ ['.' \w+]* }
  token domain { \w+ }
  token subdomain { \w+ }
  token tld { \w+ }
}
say Email.parse('[email protected]');

ne fonctionne pas, il imprime simplement Nil, mais

grammar Email {
  rule TOP { <name> '@' [<subdomain> '.']* <domain> '.' <tld> }  
  token name { \w+ ['.' \w+]* }
  token domain { \w+ }
  token subdomain { \w+ }
  token tld { \w+ }
}
say Email.parse('[email protected]');

fait fonctionne et imprime correctement

[email protected]」
 name => 「foo.bar」
 subdomain => 「baz」
 domain => 「example」
 tld => 「com」

Et tout ce que j'ai changé, c'est token TOP à rule TOP.

D'après ce que je peux tirer de la documentation, la seule différence entre ces deux mots-clés, c'est que les espaces sont significatifs dans rule, mais pas dans token. Si c'est vrai, le premier exemple devrait fonctionner, car je veux ignorer les espaces entre les pièces individuelles du motif.

Suppression des espaces entre les pièces

rule TOP { <name>'@'[<subdomain>'.']*<domain>'.'<tld> }

rétablit le comportement de l'impression Nil.

Quelqu'un peut-il me dire ce qui se passe ici?

EDIT : Changer la règle TOP en une regex à la place, ce qui permet un retour en arrière le fait fonctionner aussi.

La question demeure, comment se fait-il rule { } (qui est identique à regex {:ratchet :sigspace }) correspond lorsque token { } (qui est identique à regex {:ratchet }) non?

L'adresse e-mail ne contient aucun espace, donc à toutes fins utiles, elle devrait échouer immédiatement

15
Electric Coffee

Selon le Raku docs :

  • Les méthodes de jeton sont plus rapides que les méthodes regex et ignorent les espaces. Les méthodes de jeton ne font pas marche arrière; ils abandonnent après le premier match possible.
  • Les méthodes de règle sont les mêmes que les méthodes de jeton, sauf que les espaces ne sont pas ignorés.

Non ignoré signifie qu'ils sont traités comme une syntaxe, plutôt que littéralement mis en correspondance. Ils insèrent en fait un <.ws>. Voir sigspace pour plus d'informations à ce sujet.

3
nvisser