gscheme/scheme.flex

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