gscheme/scheme.y

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;
}
;
%%