gscheme/scheme.y

512 lines
8.1 KiB
Plaintext
Raw Permalink Normal View History

2022-08-05 05:28:40 -04:00
%{
#import "SchemeTypes.h"
#define YYSTYPE id
YYSTYPE yyresult;
int yyinputitem;
2022-08-05 05:28:41 -04:00
id yyresultform;
2022-08-05 05:28:40 -04:00
extern int yysofar;
2022-08-05 05:28:41 -04:00
extern NSMutableArray *positionStack;
2022-08-05 05:28:40 -04:00
%}
%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 */ {
2022-08-05 05:28:41 -04:00
$$ = [NSNull null];
yyresultform = $$;
2022-08-05 05:28:40 -04:00
}
| topitem top {
2022-08-05 05:28:41 -04:00
$$ = [Triple newTag:FORM_TOP Arg1:$1 Arg2:$2];
yyresultform = $$;
2022-08-05 05:28:40 -04:00
yyinputitem++;
}
;
topitem: LPAREN DEFINE SYMBOL form RPAREN {
NSValue *entry =
[NSValue valueWithRange:NSMakeRange(yysofar, 0)];
$$ = [Triple newTag:FORM_DEFINE1 Arg1:$3 Arg2:$4];
2022-08-05 05:28:41 -04:00
[[positionStack lastObject] addObject:entry];
2022-08-05 05:28:40 -04:00
}
| LPAREN DEFINE nonemptysymlist sequence RPAREN {
NSValue *entry =
[NSValue valueWithRange:NSMakeRange(yysofar, 0)];
$$ = [Triple newTag:FORM_DEFINE2 Arg1:$3 Arg2:$4];
2022-08-05 05:28:41 -04:00
[[positionStack lastObject] addObject:entry];
2022-08-05 05:28:40 -04:00
}
| form {
NSValue *entry =
[NSValue valueWithRange:NSMakeRange(yysofar, 0)];
$$ = $1;
2022-08-05 05:28:41 -04:00
[[positionStack lastObject] addObject:entry];
2022-08-05 05:28:40 -04:00
}
;
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];
}
;
2022-08-05 05:28:41 -04:00
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"];
}
;
2022-08-05 05:28:40 -04:00
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;
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
callcc: LPAREN CALLCC form RPAREN {
$$ = [Triple newTag:FORM_CALLCC Arg1:$3];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
singlecase: LPAREN LPAREN sequence RPAREN sequence RPAREN {
$$ = [Pair newCar:$3 Cdr:$5];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
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];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
elsecasecond: LPAREN ELSE sequence RPAREN {
$$ = [Pair newCar:[NSNull null] Cdr:$3];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
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]];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
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]];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
and: LPAREN AND revsequence RPAREN {
$$ = [Triple newTag:FORM_AND Arg1:$3];
}
| LPAREN AND RPAREN {
$$ = [Triple newTag:FORM_AND Arg1:[NSNull null]];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
or: LPAREN OR revsequence RPAREN {
$$ = [Triple newTag:FORM_OR Arg1:$3];
}
| LPAREN OR RPAREN {
$$ = [Triple newTag:FORM_OR Arg1:[NSNull null]];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
begin: LPAREN BEGINTOK sequence RPAREN {
$$ = [Triple newTag:FORM_BEGIN Arg1:$3];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
set: LPAREN SET SYMBOL form RPAREN {
$$ = [Triple newTag:FORM_SET Arg1:$3 Arg2:$4];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
apply: LPAREN APPLY form form RPAREN {
$$ = [Triple newTag:FORM_APPLY Arg1:$3 Arg2:$4];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
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];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
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];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
2022-08-05 05:28:41 -04:00
quote: QUOTECHAR qform {
2022-08-05 05:28:40 -04:00
$$ = [Triple newTag:FORM_QUOTE Arg1:$2];
}
2022-08-05 05:28:41 -04:00
| LPAREN QUOTE qform RPAREN {
2022-08-05 05:28:40 -04:00
$$ = [Triple newTag:FORM_QUOTE Arg1:$3];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
singlebinding: LPAREN SYMBOL form RPAREN {
$$ = [Triple newTag:FORM_BINDING Arg1:$2 Arg2:$3];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
listofbindings: singlebinding {
$$ = [Pair newCar:$1 Cdr:[NSNull null]];
}
| singlebinding listofbindings {
$$ = [Pair newCar:$1 Cdr:$2];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
let: LPAREN LET LPAREN listofbindings RPAREN sequence RPAREN {
$$ = [Triple newTag:FORM_LET Arg1:$4 Arg2:$6];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
letstar: LPAREN LETSTAR LPAREN listofbindings RPAREN sequence RPAREN {
$$ = [Triple newTag:FORM_LETSTAR Arg1:$4 Arg2:$6];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
letrec: LPAREN LETREC LPAREN listofbindings RPAREN sequence RPAREN {
$$ = [Triple newTag:FORM_LETREC Arg1:$4 Arg2:$6];
}
2022-08-05 05:28:41 -04:00
;
2022-08-05 05:28:40 -04:00
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];
}
;
2022-08-05 05:28:41 -04:00
qnonemptylistdata: qform {
$$ = [Pair newCar:$1 Cdr:[NSNull null]];
}
| qform DOT qform {
$$ = [Pair newCar:$1 Cdr:$3];
}
| qform qnonemptylistdata {
$$ = [Pair newCar:$1 Cdr:$2];
}
;
2022-08-05 05:28:40 -04:00
nonemptyvectdata: form {
$$ = [Pair newCar:$1 Cdr:[NSNull null]];
}
| form nonemptyvectdata {
$$ = [Pair newCar:$1 Cdr:$2];
}
;
2022-08-05 05:28:41 -04:00
qnonemptyvectdata: qform {
$$ = [Pair newCar:$1 Cdr:[NSNull null]];
}
| qform qnonemptyvectdata {
$$ = [Pair newCar:$1 Cdr:$2];
}
;
2022-08-05 05:28:40 -04:00
nonemptylist: LPAREN nonemptylistdata RPAREN {
$$ = $2;
}
;
2022-08-05 05:28:41 -04:00
qnonemptylist: LPAREN qnonemptylistdata RPAREN {
$$ = $2;
}
;
2022-08-05 05:28:40 -04:00
list: nonemptylist {
$$ = $1;
}
| emptylist {
$$ = $1;
}
;
2022-08-05 05:28:41 -04:00
qlist: qnonemptylist {
$$ = $1;
}
| emptylist {
$$ = $1;
}
;
2022-08-05 05:28:40 -04:00
vector: LVECTPAREN nonemptyvectdata RPAREN {
$$ = [Vector newFromList:$2];
}
| LVECTPAREN RPAREN {
$$ = [Vector newFromList:(Pair *)[NSNull null]];
}
;
2022-08-05 05:28:41 -04:00
qvector: LVECTPAREN qnonemptyvectdata RPAREN {
$$ = [Vector newFromList:$2];
}
| LVECTPAREN RPAREN {
$$ = [Vector newFromList:(Pair *)[NSNull null]];
}
;
2022-08-05 05:28:40 -04:00
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;
}
;
%%