Come posso analizzare un elenco di coppie nome = valore in un generatore di parser (ANTLR, YACC, ecc)?

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

Domanda

Voglio analizzare un elenco di (spazi separati) coppie in forma di

name1=value1 name2=value2 ...

dove:

  • nome può contenere qualsiasi cosa, tranne segno spazi e uguale
  • valore può contenere qualsiasi cosa tranne che gli spazi bianchi (tra cui segni di uguale!)

Il problema è sempre il parser per abbinare ingresso come

name1=value1

come segni 'NAME EQUALS VALUE' separati, non come un unico token 'VALUE'.

PS. So che questo è banale per codificare direttamente, ma ho bisogno di questo nel contesto di un parser più grande.

È stato utile?

Soluzione

Qui c'è qualcosa in ANTLR, che analizza questo;

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

Questo non può essere tutto il necessario, ma dovrebbe essere il nucleo.

grammar NameValuePairs;

pairs   :  namevaluepair (WS namevaluepair)*;

namevaluepair
  :  name '=' value;

name  :  ID;

value  :  ID ('=' ID)*;

WS  :  ' ' {skip()};

EQ  :  '=';

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

Altri suggerimenti

Penso che si può finire con un problema se il valore può contenere il segno di uguale. Penso che sarebbe meglio, se possibile, di fare il segno di uguale un carattere riservato, o passare a un carattere riservato diverso a significare '='.

Non sono sicuro se questo dovrebbe funzionare nel contesto del parser più grande, ma si potrebbe dividere sullo spazio, dando una matrice (o qualunque struttura di dati tua lingua userei) di 'nome = valore' coppie. Poi scorrere l'array e dividere ancora una volta il carattere riservato che si sta utilizzando per '='. Se non è possibile modificare o riserva '=', si potrebbe regex per corrispondere solo la prima istanza di '='. Spero di non essere fuori strada!

Non avete bisogno di un forte parser per coppie di valori nome, regex sarebbe sufficiente. A meno che non si dispone di qualche struttura contestuale o nidificato, questo 'lavoro' appartiene al lexer, non il parser:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top