Pegjs: Opérateurs non gourmands pour * , + et ?

Créé le 7 oct. 2011  ·  7Commentaires  ·  Source: pegjs/pegjs

J'ai un langage où il y a des instances répétées du même modèle où je ne me soucie que du premier symbole. Par example:

          system       OBJECT IDENTIFIER ::= { mib-2 1 }
          interfaces   OBJECT IDENTIFIER ::= { mib-2 2 }
          at           OBJECT IDENTIFIER ::= { mib-2 3 }
          ip           OBJECT IDENTIFIER ::= { mib-2 4 }
          icmp         OBJECT IDENTIFIER ::= { mib-2 5 }
          tcp          OBJECT IDENTIFIER ::= { mib-2 6 }
          udp          OBJECT IDENTIFIER ::= { mib-2 7 }
          egp          OBJECT IDENTIFIER ::= { mib-2 8 }

Cet exemple simple pourrait correspondre à ce modèle (où _ est un espace) :

identifier _ "OBJECT IDENTIFIER" _ "::=" _ "{" _ identifier _ number _ "}"

Ce n'est pas si grave dans ce cas (j'ai déjà tapé le modèle :-) Mais le langage a un ensemble d'autres grosses constructions velues qui ne justifient pas l'analyse complète faire le travail que j'ai en tête).

Je voudrais taper quelque chose comme ce modèle :

identifier _ "OBJECT IDENTIFIER" .*? "}"

où le ".*?" n'est pas gourmand - il ne consomme que jusqu'à la première occurrence du terminal. Cela pourrait-il être sur la liste pour PEG.js ? Merci beaucoup.

Commentaire le plus utile

Dans le formalisme PEG , vous pouvez facilement faire correspondre jusqu'à un terminateur en utilisant un prédicat avec le métacaractère . . Quelque chose comme:

"OBJECT IDENTIFIER" (!"}" .)* "}"

Est-ce suffisant pour vous ?

Tous les 7 commentaires

Mise à jour : cela pourrait être satisfait par un nombre de répétitions (qui est une généralisation de ma pensée initiale) comme suggéré dans Google Groupes à l' adresse :

Dans le formalisme PEG , vous pouvez facilement faire correspondre jusqu'à un terminateur en utilisant un prédicat avec le métacaractère . . Quelque chose comme:

"OBJECT IDENTIFIER" (!"}" .)* "}"

Est-ce suffisant pour vous ?

Oui, cela fonctionne parfaitement. Merci!

@dmajda Quelle est la pratique recommandée pour supprimer le caractère vide renvoyé par l'expression !"}" ?

Par example:

   = chars:(!"-suffix" .)+ "-suffix"

"foo-suffix" => [[ '', 'f' ], ['', 'o' ], ['', 'o' ]]  // result
"foo-suffix" => ['f', 'o', 'o' ] // desired result

J'ai pu y parvenir en divisant !"-suffix" . dans sa propre règle qui renvoie simplement le résultat . , mais je suis curieux de savoir s'il existe un meilleur moyen.

66 résoudra cela.

Je pense qu'en attendant, vous pouvez utiliser:

    = chars:(!"-suffix" c:. {return c})+ "-suffix"

@islandr Veuillez ne pas utiliser les problèmes pour poser des questions sur l'utilisation de PEG.js. Surtout quand ils sont fermés et surtout quand vous demandez quelque chose que d'autres personnes à côté de moi peuvent vous aider. Le canal approprié est le groupe Google .

Désolé David. Je pensais que cela aurait été un bon endroit car c'était
directement lié à l'exemple que vous avez donné.

Le mercredi 9 janvier 2013 à 21h51, David Majda [email protected] a écrit :

@islandr https://github.com/islandr Veuillez ne pas utiliser les problèmes comme lieu
pour poser des questions sur l'utilisation de PEG.js. Surtout quand ils sont fermés et
surtout quand vous demandez quelque chose que d'autres personnes à côté de moi peuvent
vous aider avec. Le canal approprié est le groupe Googlehttp://groups.google.com/group/pegjs
.

-
Répondez directement à cet e-mail ou consultez-le sur Gi tHubhttps://github.com/dmajda/pegjs/issues/57#issuecomment -12083927.

Cette page vous a été utile?
0 / 5 - 0 notes