#header << #include typedef double Attrib; >> << main() { ANTLR(statement(), stdin); } int zzd_attr(Attrib *attr) { if (attr != NULL ) { free(attr); attr = NULL; } } int zzcr_attr(Attrib *attr, int token, char *text) { char c; switch (token) { case Number: *attr = atof(text); break; case Symbol: *attr = text[0] - 'a'; break; } } static double vbltable[26]; double gensym(char c, double num) { vbltable[c] = num; return num; } double lookup(char c) { return vbltable[c]; } >> #token "[\t\ \r]" <> /* Ignore White */ #token Number "([0-9]+|([0-9]*\.[0-9]+){[eE]{[\+\-]}[0-9]+})" #token Symbol "[a-z]" statement : (expressions)* "@" <> ; expressions : Symbol "=" expr <<$expressions = gensym($1.1, $3);>> "\n" <> | expr "\n" <> | "\n" /* empty line */ ; expr : mexpr <<$expr = $1;>> ( "\+" mexpr <<$expr += $2;>> | "\-" mexpr <<$expr -= $2;>> )* ; mexpr : unary <<$mexpr = $1;>> ( "\*" unary <<$mexpr *= $2;>> | "\/" unary <<$mexpr /= $2;>> )* ; unary : prim <<$unary = $1;>> | "\-" prim <<$unary = -$2;>> ; prim : "\(" expr "\)" <<$prim = $2;>> | Number <<$prim = $1;>> | Symbol <<$prim = lookup($1);>> ;