%{ int variavel[27], ultimo; #include #include "xmc.h" SEXP _JJ; #define reg(x) variavel[x-'a'] #define infix(x) $$=f2(x,$1,$3) #define infixs $$=conssexp($2,l2sexp($1,$3)) %} %union {SEXP val;} %token JINT JSYM JSTR OPREL %type JINT OPREL JSYM JSTR E %right '=' %left '+' '-' %left '*' '/' %left opuna %% Z : {_JJ=(SEXP) NULL;} E '$' {_JJ=$2; return(1);} ; E : E '+' E {infix("add");} | E '-' E {infix("sub");} | E '/' E {infix("div");} | E '*' E {infix("mul");} | '(' E ')' {$$=$2;} | JINT {$$=$1;} | '+' E %prec opuna {$$=$2;} | '-' E %prec opuna {$$=f2("sub",intsex(0),$2);} | '.' {$$=symsexp("ultimo");} | JSYM {$$=$1;} | JSYM '=' E {infix("def");} | E OPREL E {infixs;} ; %% SEXP jjparse(d) SEXP d; { yyparse(); return _JJ;} void userinit() {xlsubr("parse",jjparse);} #include "lex.yy.c"