512 lines
8.1 KiB
Plaintext
512 lines
8.1 KiB
Plaintext
%{
|
|
#import "SchemeTypes.h"
|
|
|
|
#define YYSTYPE id
|
|
|
|
YYSTYPE yyresult;
|
|
int yyinputitem;
|
|
id yyresultform;
|
|
|
|
extern int yysofar;
|
|
extern NSMutableArray *positionStack;
|
|
%}
|
|
|
|
%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 */ {
|
|
$$ = [NSNull null];
|
|
yyresultform = $$;
|
|
}
|
|
| topitem top {
|
|
$$ = [Triple newTag:FORM_TOP Arg1:$1 Arg2:$2];
|
|
yyresultform = $$;
|
|
|
|
yyinputitem++;
|
|
}
|
|
;
|
|
|
|
topitem: LPAREN DEFINE SYMBOL form RPAREN {
|
|
NSValue *entry =
|
|
[NSValue valueWithRange:NSMakeRange(yysofar, 0)];
|
|
|
|
$$ = [Triple newTag:FORM_DEFINE1 Arg1:$3 Arg2:$4];
|
|
|
|
[[positionStack lastObject] addObject:entry];
|
|
}
|
|
| LPAREN DEFINE nonemptysymlist sequence RPAREN {
|
|
NSValue *entry =
|
|
[NSValue valueWithRange:NSMakeRange(yysofar, 0)];
|
|
|
|
$$ = [Triple newTag:FORM_DEFINE2 Arg1:$3 Arg2:$4];
|
|
|
|
[[positionStack lastObject] addObject:entry];
|
|
}
|
|
| form {
|
|
NSValue *entry =
|
|
[NSValue valueWithRange:NSMakeRange(yysofar, 0)];
|
|
|
|
$$ = $1;
|
|
|
|
[[positionStack lastObject] 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];
|
|
}
|
|
;
|
|
|
|
qform: INTEGER {
|
|
$$ = $1;
|
|
}
|
|
| CHAR {
|
|
$$ = $1;
|
|
}
|
|
| BOOLEAN {
|
|
$$ = $1;
|
|
}
|
|
| DOUBLE {
|
|
$$ = $1;
|
|
}
|
|
| SYMBOL {
|
|
$$ = $1;
|
|
}
|
|
| STRING {
|
|
$$ = $1;
|
|
}
|
|
| qlist {
|
|
$$ = $1;
|
|
}
|
|
| qvector {
|
|
$$ = $1;
|
|
}
|
|
| QUOTECHAR qform {
|
|
$$ = [Pair newCar:[[Symbol alloc] initSCMSymbol:"quote"]
|
|
Cdr:[Pair newCar:$2 Cdr:[NSNull null]]];
|
|
}
|
|
| ARROW {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"=>"];
|
|
}
|
|
| QUOTE {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"quote"];
|
|
}
|
|
| CALLCC {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"call-with-current-continuation"];
|
|
}
|
|
| APPLY {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"apply"];
|
|
}
|
|
| DEFINE {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"define"];
|
|
}
|
|
| SET {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"set!"];
|
|
}
|
|
| LAMBDA {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"lambda"];
|
|
}
|
|
| IF {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"if"];
|
|
}
|
|
| BEGINTOK {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"begin"];
|
|
}
|
|
| AND {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"and"];
|
|
}
|
|
| OR {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"or"];
|
|
}
|
|
| CASE {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"case"];
|
|
}
|
|
| COND {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"cond"];
|
|
}
|
|
| ELSE {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"else"];
|
|
}
|
|
| LET {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"let"];
|
|
}
|
|
| LETSTAR {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"let*"];
|
|
}
|
|
| LETREC {
|
|
$$ = [[Symbol alloc] initSCMSymbol:"letrec"];
|
|
}
|
|
;
|
|
|
|
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 qform {
|
|
$$ = [Triple newTag:FORM_QUOTE Arg1:$2];
|
|
}
|
|
| LPAREN QUOTE qform 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];
|
|
}
|
|
;
|
|
|
|
qnonemptylistdata: qform {
|
|
$$ = [Pair newCar:$1 Cdr:[NSNull null]];
|
|
}
|
|
| qform DOT qform {
|
|
$$ = [Pair newCar:$1 Cdr:$3];
|
|
}
|
|
| qform qnonemptylistdata {
|
|
$$ = [Pair newCar:$1 Cdr:$2];
|
|
}
|
|
;
|
|
|
|
nonemptyvectdata: form {
|
|
$$ = [Pair newCar:$1 Cdr:[NSNull null]];
|
|
}
|
|
| form nonemptyvectdata {
|
|
$$ = [Pair newCar:$1 Cdr:$2];
|
|
}
|
|
;
|
|
|
|
qnonemptyvectdata: qform {
|
|
$$ = [Pair newCar:$1 Cdr:[NSNull null]];
|
|
}
|
|
| qform qnonemptyvectdata {
|
|
$$ = [Pair newCar:$1 Cdr:$2];
|
|
}
|
|
;
|
|
|
|
nonemptylist: LPAREN nonemptylistdata RPAREN {
|
|
$$ = $2;
|
|
}
|
|
;
|
|
|
|
qnonemptylist: LPAREN qnonemptylistdata RPAREN {
|
|
$$ = $2;
|
|
}
|
|
;
|
|
|
|
list: nonemptylist {
|
|
$$ = $1;
|
|
}
|
|
| emptylist {
|
|
$$ = $1;
|
|
}
|
|
;
|
|
|
|
qlist: qnonemptylist {
|
|
$$ = $1;
|
|
}
|
|
| emptylist {
|
|
$$ = $1;
|
|
}
|
|
;
|
|
|
|
vector: LVECTPAREN nonemptyvectdata RPAREN {
|
|
$$ = [Vector newFromList:$2];
|
|
}
|
|
| LVECTPAREN RPAREN {
|
|
$$ = [Vector newFromList:(Pair *)[NSNull null]];
|
|
}
|
|
;
|
|
|
|
qvector: LVECTPAREN qnonemptyvectdata 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;
|
|
}
|
|
;
|
|
|
|
%%
|
|
|