%{ #import "SchemeTypes.h" #define YYSTYPE id YYSTYPE yyresult; int yyinputitem; extern int yysofar; extern NSMutableArray *positions; %} %token LPAREN %token LVECTPAREN %token RPAREN %token DEFINE %token SET %token LAMBDA %token BEGINTOK %token AND %token OR %token CASE %token COND %token ELSE %token ARROW %token CALLCC %token APPLY %token IF %token LET %token LETSTAR %token LETREC %token DOT %token INTEGER %token CHAR %token BOOLEAN %token DOUBLE %token SYMBOL %token STRING %token QUOTECHAR %token QUOTE %% top: /* empty */ { yyresult = $$ = [NSNull null]; } | topitem top { yyresult = $$ = [Triple newTag:FORM_TOP Arg1:$1 Arg2:$2]; yyinputitem++; } ; topitem: LPAREN DEFINE SYMBOL form RPAREN { NSValue *entry = [NSValue valueWithRange:NSMakeRange(yysofar, 0)]; $$ = [Triple newTag:FORM_DEFINE1 Arg1:$3 Arg2:$4]; [positions addObject:entry]; } | LPAREN DEFINE nonemptysymlist sequence RPAREN { NSValue *entry = [NSValue valueWithRange:NSMakeRange(yysofar, 0)]; $$ = [Triple newTag:FORM_DEFINE2 Arg1:$3 Arg2:$4]; [positions addObject:entry]; } | form { NSValue *entry = [NSValue valueWithRange:NSMakeRange(yysofar, 0)]; $$ = $1; [positions addObject:entry]; } ; sequence: form { $$ = [Pair newCar:$1 Cdr:[NSNull null]]; } | form sequence { $$ = [Pair newCar:$1 Cdr:$2]; } ; revsequence: form { $$ = [Pair newCar:$1 Cdr:[NSNull null]]; } | revsequence form { $$ = [Pair newCar:$2 Cdr:$1]; } ; form: INTEGER { $$ = $1; } | CHAR { $$ = $1; } | BOOLEAN { $$ = $1; } | DOUBLE { $$ = $1; } | SYMBOL { $$ = $1; } | STRING { $$ = $1; } | list { $$ = $1; } | vector { $$ = $1; } | lambda { $$ = $1; } | if { $$ = $1; } | let { $$ = $1; } | letstar { $$ = $1; } | letrec { $$ = $1; } | quote { $$ = $1; } | apply { $$ = $1; } | set { $$ = $1; } | begin { $$ = $1; } | and { $$ = $1; } | or { $$ = $1; } | case { $$ = $1; } | cond { $$ = $1; } | callcc { $$ = $1; } callcc: LPAREN CALLCC form RPAREN { $$ = [Triple newTag:FORM_CALLCC Arg1:$3]; } singlecase: LPAREN LPAREN sequence RPAREN sequence RPAREN { $$ = [Pair newCar:$3 Cdr:$5]; } singlecond: LPAREN form RPAREN { $$ = [Triple newTag:FORM_SCOND1 Arg1:$2]; } | LPAREN form sequence RPAREN { $$ = [Triple newTag:FORM_SCOND2 Arg1:$2 Arg2:$3]; } | LPAREN form ARROW form RPAREN { $$ = [Triple newTag:FORM_SCOND3 Arg1:$2 Arg2:$4]; } elsecasecond: LPAREN ELSE sequence RPAREN { $$ = [Pair newCar:[NSNull null] Cdr:$3]; } cases: singlecase { $$ = [Pair newCar:$1 Cdr:[NSNull null]]; } | cases singlecase { $$ = [Pair newCar:$2 Cdr:$1]; } ; conditions: singlecond { $$ = [Pair newCar:$1 Cdr:[NSNull null]]; } | conditions singlecond { $$ = [Pair newCar:$2 Cdr:$1]; } ; case: LPAREN CASE form cases RPAREN { $$ = [Triple newTag:FORM_CASE Arg1:$3 Arg2:$4]; } | LPAREN CASE form cases elsecasecond RPAREN { $$ = [Triple newTag:FORM_CASE Arg1:$3 Arg2:[Pair newCar:$5 Cdr:$4]]; } cond: LPAREN COND conditions RPAREN { $$ = [Triple newTag:FORM_COND Arg1:$3]; } | LPAREN COND conditions elsecasecond RPAREN { $$ = [Triple newTag:FORM_COND Arg1:[Pair newCar:$4 Cdr:$3]]; } and: LPAREN AND revsequence RPAREN { $$ = [Triple newTag:FORM_AND Arg1:$3]; } | LPAREN AND RPAREN { $$ = [Triple newTag:FORM_AND Arg1:[NSNull null]]; } or: LPAREN OR revsequence RPAREN { $$ = [Triple newTag:FORM_OR Arg1:$3]; } | LPAREN OR RPAREN { $$ = [Triple newTag:FORM_OR Arg1:[NSNull null]]; } begin: LPAREN BEGINTOK sequence RPAREN { $$ = [Triple newTag:FORM_BEGIN Arg1:$3]; } set: LPAREN SET SYMBOL form RPAREN { $$ = [Triple newTag:FORM_SET Arg1:$3 Arg2:$4]; } apply: LPAREN APPLY form form RPAREN { $$ = [Triple newTag:FORM_APPLY Arg1:$3 Arg2:$4]; } if: LPAREN IF form form RPAREN { $$ = [Triple newTag:FORM_IF1 Arg1:$3 Arg2:$4]; } | LPAREN IF form form form RPAREN { $$ = [Triple newTag:FORM_IF2 Arg1:$3 Arg2:$4 Arg3:$5]; } lambda: LPAREN LAMBDA SYMBOL sequence RPAREN { $$ = [Triple newTag:FORM_LAMBDA1 Arg1:$3 Arg2:$4]; } | LPAREN LAMBDA symlist sequence RPAREN { $$ = [Triple newTag:FORM_LAMBDA2 Arg1:$3 Arg2:$4]; } quote: QUOTECHAR form { $$ = [Triple newTag:FORM_QUOTE Arg1:$2]; } | LPAREN QUOTE form RPAREN { $$ = [Triple newTag:FORM_QUOTE Arg1:$3]; } singlebinding: LPAREN SYMBOL form RPAREN { $$ = [Triple newTag:FORM_BINDING Arg1:$2 Arg2:$3]; } listofbindings: singlebinding { $$ = [Pair newCar:$1 Cdr:[NSNull null]]; } | singlebinding listofbindings { $$ = [Pair newCar:$1 Cdr:$2]; } let: LPAREN LET LPAREN listofbindings RPAREN sequence RPAREN { $$ = [Triple newTag:FORM_LET Arg1:$4 Arg2:$6]; } letstar: LPAREN LETSTAR LPAREN listofbindings RPAREN sequence RPAREN { $$ = [Triple newTag:FORM_LETSTAR Arg1:$4 Arg2:$6]; } letrec: LPAREN LETREC LPAREN listofbindings RPAREN sequence RPAREN { $$ = [Triple newTag:FORM_LETREC Arg1:$4 Arg2:$6]; } emptylist: LPAREN RPAREN { $$ = [NSNull null]; } ; nonemptylistdata: form { $$ = [Pair newCar:$1 Cdr:[NSNull null]]; } | form DOT form { $$ = [Pair newCar:$1 Cdr:$3]; } | form nonemptylistdata { $$ = [Pair newCar:$1 Cdr:$2]; } ; nonemptyvectdata: form { $$ = [Pair newCar:$1 Cdr:[NSNull null]]; } | form nonemptyvectdata { $$ = [Pair newCar:$1 Cdr:$2]; } ; nonemptylist: LPAREN nonemptylistdata RPAREN { $$ = $2; } ; list: nonemptylist { $$ = $1; } | emptylist { $$ = $1; } ; vector: LVECTPAREN nonemptyvectdata RPAREN { $$ = [Vector newFromList:$2]; } | LVECTPAREN RPAREN { $$ = [Vector newFromList:(Pair *)[NSNull null]]; } ; nonemptysymlistdata: SYMBOL { $$ = [Pair newCar:$1 Cdr:[NSNull null]]; } | SYMBOL DOT SYMBOL { $$ = [Pair newCar:$1 Cdr:$3]; } | SYMBOL nonemptysymlistdata { $$ = [Pair newCar:$1 Cdr:$2]; } ; nonemptysymlist: LPAREN nonemptysymlistdata RPAREN { $$ = $2; } ; symlist: nonemptysymlist { $$ = $1; } | emptylist { $$ = $1; } ; %%