%{ #import #import #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; %%