Question

De Parsekit: Comment faire correspondre les personnages de citation individuels?

Si vous définissez un analyseur:

@start = int;
int = /[+-]?[0-9]+/

Malheureusement, cela ne va pas analyser les entiers préfixés avec un "+", sauf si vous incluez:

@numberState = "+" // at the top.

Dans l'analyse du nombre ci-dessus, l'analyseur par défaut "symbole" n'a même pas été mentionné, mais il est toujours actif et remplace les analyseurs définis par l'utilisateur.

D'accord, avec des numéros, vous pouvez toujours le réparer en ajoutant la directive. Et si vous essayez de créer un analyseur pour "++"? Je n'ai trouvé aucune directive qui peut faire fonctionner le analyseur suivant.

@start = plusplus;
plusplus = "++";

Les effets des analyseurs par défaut sur l'analyseur utilisateur semblent si arbitraires. Pourquoi ne puis-je pas analyser "++"?

Est-il possible de désactiver complètement les analyseurs par défaut? Ils semblent gêner si je ne fais pas quelque chose de commun.

Ou peut-être que j'ai tout faux.

ÉDITER:

J'ai trouvé un analyseur qui analyserait plus plus:

@start = plusplus;
plusplus = plus plus;
plus = "+";

Je suppose que la réponse est: les symboles littéraux définis dans votre analyseur ne peuvent pas se chevaucher entre les analyseurs par défaut; Il doit être contenu complètement par au moins une fois d'entre eux.

Était-ce utile?

La solution

Développeur de Parsekit ici.

J'ai quelques réponses.

  1. Je pense que vous trouverez l'API Parsekit très élégante et sensée, plus vous en apprenez. Gardez à l'esprit que je ne tire pas ma propre corne en disant cela. Bien que j'aie construit Parsekit, je n'ai pas conçu l'API Parsekit. La conception de Parsekit est plutôt basée presque entièrement sur les conceptions trouvées dans Steven Metsker Bâtiment des analyseurs à Java. Je vous recommande fortement de vérifier le livre si vous souhaitez comprendre profondément Parsekit. De plus, c'est un livre fantastique sur l'analyse en général.

  2. Tu es confondu États de tokenizer avec Analyseurs. Ce sont deux choses distinctes, mais les détails sont plus complexes que je ne peux répondre ici. Encore une fois, je recommande le livre de Metsker.

  3. Au cours de la réponse à votre question, j'ai trouvé un petit bug dans Parsekit. Merci! Cependant, cela n'affecte pas votre résultat décrit ci-dessus car vous n'utilisiez pas la bonne grammaire pour obtenir le résultat qu'il semble que vous recherchiez. Vous devrez mettre à jour votre code source à partir du Projet Google Code Maintenant, sinon mon conseil ci-dessous ne fonctionnera pas pour vous.


Maintenant pour répondre à votre question.

Je pense que vous cherchez une grammaire qui reconnaît toutes les deux ++ En tant que multi-chargement Symbol Jeton et reconnaît également les chiffres avec + Chars comme des nombres explicitement positifs plutôt que + Symbol jeton suivi d'un Number jeton.

La bonne grammaire que je crois que vous cherchez est quelque chose comme ceci:

@symbols = '++';    // declare ++ as a multi-char symbol
@numberState = '+'; // allow explicitly-positive numbers
@start = (Number|Symbol)*;

Entrée comme ceci:

++ +1 -2 + 3 ++

Sera tokenisé comme tel:

[++, +1, -2, +, 3, ++]++/+1/-2/+/3/++^

Deux rappels:

  1. Encore une fois, vous devrez mettre à jour votre code source maintenant pour voir ce travail correctement. J'ai dû corriger un bug dans ce cas.
  2. Ce truc est délicat, et je recommande de lire le livre de Metsker pour bien comprendre comment fonctionne Parsekit.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top