Comment puis-je analyser une liste de paires nom = valeur dans un générateur d'analyseur (ANTLR, YACC etc.)?
-
23-08-2019 - |
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.
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:)