370 lines
6.0 KiB
Plaintext
370 lines
6.0 KiB
Plaintext
%{
|
|
#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;
|
|
}
|
|
;
|
|
|
|
%%
|
|
|