#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: c = text[0] - 'a'; if (c < 0) c = -c; *attr = c % ('z' - '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 : expr <<$expressions = $1;>> ("="^ expr <<$expressions = gensym($1, $3);>>)* "\n" <> | "\n" ; 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);>> ;