Comment puis-je analyser une liste de paires nom = valeur dans un générateur d'analyseur (ANTLR, YACC etc.)?

StackOverflow https://stackoverflow.com/questions/897934

Question

Je souhaite analyser une liste de (espaces séparés) sous la forme de paires de

name1=value1 name2=value2 ...

où:

  • nom peut contenir quoi que ce soit, sauf signe des espaces et égaux
  • valeur peut contenir quoi que ce soit, sauf les espaces (y compris le signe égal!)

Le problème est d'obtenir l'analyseur pour correspondre à l'entrée comme

name1=value1

en tant que jetons de 'NAME EQUALS VALUE' séparés, non pas comme un seul jeton de 'VALUE'.

PS. Je sais que cela est trivial de coder directement, mais j'ai besoin dans le contexte d'un analyseur plus grand.

Était-ce utile?

La solution

Voici quelque chose dans antlr, qui parse cela;

a=b=c=d c=d e=f

Ce ne peut pas être tout ce dont vous avez besoin, mais il doit être le noyau.

grammar NameValuePairs;

pairs   :  namevaluepair (WS namevaluepair)*;

namevaluepair
  :  name '=' value;

name  :  ID;

value  :  ID ('=' ID)*;

WS  :  ' ' {skip()};

EQ  :  '=';

ID  :  ~(' ' | '=')*;

Autres conseils

Je pense que vous pouvez vous retrouver avec un problème si la valeur peut contenir le signe égal. Je pense que ce serait mieux, si possible, de faire le signe égal un caractère réservé, ou passer à un autre caractère réservé signifie « = ».

Je ne sais pas si cela fonctionnerait dans le contexte de votre analyseur plus grand, mais vous pouvez diviser l'espace, vous donnant un tableau (ou quelle que soit la structure de données langue utiliserais) de « NOM = valeur » paires. Puis boucle à travers le réseau et divisé à nouveau sur le caractère réservé que vous utilisez pour « = ». Si vous ne pouvez pas changer ou réserve « = », vous pouvez regex en tout premier lieu de « = ». J'espère que je ne suis pas tout à fait farfelu!

Vous ne avez pas besoin d'un analyseur forte pour les paires de valeurs de nom, regex serait suffisant. Sauf si vous avez une structure contextuelle ou imbriquées, ce « travail » appartient au lexer, pas l'analyseur:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top