Frage

Wie erstelle ich ein Token in Lexer, die Rekursion innerhalb dieser Zeichenfolge umgehen kann:

${*anything*${*anything*}*anything*}

War es hilfreich?

Lösung

Ja, Sie Rekursion innerhalb Lexer Regeln verwenden können.

Nehmen Sie das folgende Beispiel:

${a ${b} ${c ${ddd} c} a}

, die korrekt durch die folgende Grammatik analysiert werden:

parse
  : DollarVar
  ;

DollarVar
  : '${' (DollarVar | EscapeSequence | ~Special)+ '}'
  ;

fragment 
Special
  :  '\\' | '$' | '{' | '}'
  ;

fragment
EscapeSequence
  :  '\\' Special
  ;

als Dolmetscher innerhalb ANTLRWorks zeigt:

alt text http://img185.imageshack.us/img185/5471/recq .png

Andere Tipps

ANTLR der lexers unterstützen Rekursion, wie @BartK adeptly in seinem Beitrag darlegt, aber Sie werden nur ein einziges Token innerhalb des Parsers sehen. Wenn Sie die verschiedenen Teile innerhalb dieses Token interpretieren müssen, werden Sie wahrscheinlich wollen sie innerhalb des Parsers behandeln.

IMO, dann würden Sie besser dran, etwas in den Parser zu tun:

variable: DOLLAR LBRACE id variable id RBRACE;

Mit dem so etwas wie die oben tun, werden Sie alle notwendigen Stücke sehen und kann eine AST aufbauen oder anderweitig entsprechend behandeln.

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