Wie kann ich eine Liste von Name = Wert-Paare in einem Parser-Generator (ANTLR, YACC usw.) analysieren?

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

Frage

Ich möchte eine Liste von (Leerzeichen getrennt) Paare in Form von

analysieren
name1=value1 name2=value2 ...

Dabei gilt:

  • NAME kann alles außer Leerzeichen und Gleichheitszeichen enthalten
  • kann VALUE alles außer Leerzeichen enthalten (einschließlich Gleichheitszeichen!)

Das Problem ist immer der Parser Eingang übereinstimmen wie

name1=value1

als separater 'NAME EQUALS VALUE' Tokens, nicht als einzelne 'VALUE' Token.

PS. Ich weiß, das ist trivial direkt zu codieren, aber ich muss dies im Rahmen eines größeren Parser.

War es hilfreich?

Lösung

Hier ist etwas in antlr, die diese parst;

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

Das kann nicht sein, alles was man braucht, aber es sollte der Kern sein.

grammar NameValuePairs;

pairs   :  namevaluepair (WS namevaluepair)*;

namevaluepair
  :  name '=' value;

name  :  ID;

value  :  ID ('=' ID)*;

WS  :  ' ' {skip()};

EQ  :  '=';

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

Andere Tipps

Ich glaube, Sie mit einem Problem können am Ende, wenn VALUE das Gleichheitszeichen enthalten kann. Ich denke, es wäre besser, wenn möglich, das Gleichheitszeichen eines reserviertes Zeichen zu machen, oder wechseln Sie zu einem anderen reservierten Zeichen bedeuten ‚=‘.

Ich bin mir nicht sicher, ob dies im Zusammenhang mit Ihrer größeren Parser funktionieren würde, aber man konnte auf den Raum geteilt, ein Array zu geben (oder was auch immer Datenstruktur Ihrer Sprache verwenden ist) von ‚Name = Wert‘ Paare. Dann Schleife durch das Array und Split wieder auf dem reservierten Zeichen, das Sie verwenden für ‚=‘. Wenn Sie nicht ändern können oder Reserve ‚=‘, könnte man nur regex die erste Instanz entsprechen der ‚=‘. Hoffe, ich bin nicht weg Basis!

Sie brauchen nicht einen starken Parser für Paare Name Wert, würde regex ausreichend sein. Es sei denn, Sie einige kontextuelle oder verschachtelte Struktur haben, diese ‚job‘ gehört in den Lexer, nicht der Parser:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top