211 lines
3.6 KiB
Plaintext
211 lines
3.6 KiB
Plaintext
%{
|
|
#import <Foundation/Foundation.h>
|
|
#import <AppKit/AppKit.h>
|
|
|
|
#import "SchemeTypes.h"
|
|
|
|
#define YYSTYPE id
|
|
|
|
#include "scheme.tab.m.h"
|
|
|
|
int yyinputline;
|
|
char *yyinputstr, *yyinputstart;
|
|
int yysofar;
|
|
|
|
#define YY_INPUT(buf,result,max_size) \
|
|
{ \
|
|
int c = *yyinputstr++; \
|
|
result = (!c) ? YY_NULL : (buf[0] = c, 1); \
|
|
}
|
|
%}
|
|
|
|
SIGN "+"|"-"
|
|
DIGIT [0-9]
|
|
FRAC "."{DIGIT}+
|
|
EXPONENT {SIGN}?[eE]{SIGN}?{DIGIT}+
|
|
LETTER [a-zA-Z]
|
|
SYMEXTRA [-+*/><=!?]
|
|
SYMSPECIAL ">="|"<="
|
|
|
|
STRING "\""([^\n\"\\]|"\\\\"|"\\\"")*"\""
|
|
|
|
%%
|
|
|
|
";".[^\n]*$ { /* skip comments */
|
|
yyinputline++;
|
|
yysofar += yyleng;
|
|
}
|
|
|
|
"'" {
|
|
yysofar += yyleng; return QUOTECHAR;
|
|
}
|
|
|
|
"=>" {
|
|
yysofar += yyleng; return ARROW;
|
|
}
|
|
|
|
"quote" {
|
|
yysofar += yyleng; return QUOTE;
|
|
}
|
|
|
|
"call-with-current-continuation" {
|
|
yysofar += yyleng; return CALLCC;
|
|
}
|
|
|
|
"apply" {
|
|
yysofar += yyleng; return APPLY;
|
|
}
|
|
|
|
"define" {
|
|
yysofar += yyleng; return DEFINE;
|
|
}
|
|
|
|
"set!" {
|
|
yysofar += yyleng; return SET;
|
|
}
|
|
|
|
"lambda" {
|
|
yysofar += yyleng; return LAMBDA;
|
|
}
|
|
|
|
"if" {
|
|
yysofar += yyleng; return IF;
|
|
}
|
|
|
|
"begin" {
|
|
yysofar += yyleng; return BEGINTOK;
|
|
}
|
|
|
|
"and" {
|
|
yysofar += yyleng; return AND;
|
|
}
|
|
|
|
"or" {
|
|
yysofar += yyleng; return OR;
|
|
}
|
|
|
|
"case" {
|
|
yysofar += yyleng; return CASE;
|
|
}
|
|
|
|
"cond" {
|
|
yysofar += yyleng; return COND;
|
|
}
|
|
|
|
"else" {
|
|
yysofar += yyleng; return ELSE;
|
|
}
|
|
|
|
"let" {
|
|
yysofar += yyleng; return LET;
|
|
}
|
|
|
|
"let*" {
|
|
yysofar += yyleng; return LETSTAR;
|
|
}
|
|
|
|
"letrec" {
|
|
yysofar += yyleng; return LETREC;
|
|
}
|
|
|
|
"#"[tf] {
|
|
BOOL val = (yytext[1]=='t' ? YES : NO);
|
|
yylval = [[Boolean alloc] initSCMBoolean:val];
|
|
yysofar += yyleng; return BOOLEAN;
|
|
}
|
|
|
|
"#\\"("newline"|"space"|"tab"|[^\n\t ]) {
|
|
char val;
|
|
if(!strcmp(yytext, "#\\newline")){
|
|
val = '\n';
|
|
}
|
|
else if(!strcmp(yytext, "#\\tab")){
|
|
val = '\t';
|
|
}
|
|
else if(!strcmp(yytext, "#\\space")){
|
|
val = ' ';
|
|
}
|
|
else{
|
|
val = yytext[2];
|
|
}
|
|
|
|
yylval = [[Char alloc] initSCMChar:val];
|
|
yysofar += yyleng; return CHAR;
|
|
}
|
|
|
|
{SIGN}?{DIGIT}*{FRAC} {
|
|
double val;
|
|
sscanf(yytext, "%le", &val);
|
|
yylval = [[Double alloc] initSCMDouble:val];
|
|
yysofar += yyleng; return DOUBLE;
|
|
}
|
|
|
|
{SIGN}?{DIGIT}+"." {
|
|
double val;
|
|
sscanf(yytext, "%le", &val);
|
|
yylval = [[Double alloc] initSCMDouble:val];
|
|
yysofar += yyleng; return DOUBLE;
|
|
}
|
|
|
|
{SIGN}?{DIGIT}+{EXPONENT} {
|
|
double val;
|
|
sscanf(yytext, "%le", &val);
|
|
yylval = [[Double alloc] initSCMDouble:val];
|
|
yysofar += yyleng; return DOUBLE;
|
|
}
|
|
|
|
{SIGN}?{DIGIT}*{FRAC}{EXPONENT} {
|
|
double val;
|
|
sscanf(yytext, "%le", &val);
|
|
yylval = [[Double alloc] initSCMDouble:val];
|
|
yysofar += yyleng; return DOUBLE;
|
|
}
|
|
|
|
{SIGN}?{DIGIT}+ {
|
|
long int val;
|
|
sscanf(yytext, "%ld", &val);
|
|
yylval = [[Int alloc] initSCMInt:val];
|
|
yysofar += yyleng; return INTEGER;
|
|
}
|
|
|
|
{SYMSPECIAL}|{SYMEXTRA} {
|
|
yylval = [[Symbol alloc] initSCMSymbol:yytext];
|
|
yysofar += yyleng; return SYMBOL;
|
|
}
|
|
|
|
|
|
{LETTER}({LETTER}|{DIGIT}|{SYMEXTRA}|"?"|"*")* {
|
|
yylval = [[Symbol alloc] initSCMSymbol:yytext];
|
|
yysofar += yyleng; return SYMBOL;
|
|
}
|
|
|
|
{STRING} {
|
|
yylval = [[String alloc] initSCMStringLEX:yytext];
|
|
yysofar += yyleng; return STRING;
|
|
}
|
|
|
|
"#(" {
|
|
yysofar += yyleng; return LVECTPAREN;
|
|
}
|
|
|
|
"(" {
|
|
yysofar += yyleng; return LPAREN;
|
|
}
|
|
|
|
")" {
|
|
yysofar += yyleng; return RPAREN;
|
|
}
|
|
|
|
"." {
|
|
yysofar += yyleng; return DOT;
|
|
}
|
|
|
|
[ \t]+ yysofar += yyleng; /* eat up whitespace */
|
|
|
|
"\n" yysofar += yyleng; yyinputline++;
|
|
|
|
. printf( "Unrecognized character: %s\n", yytext); yysofar += yyleng;
|
|
|
|
%%
|
|
|