/*=====<< Scanner for BASIC >>=====*/ %{ #include "mbasic.h" #include "y.tab.h" %} %s BEXPR NLIT (([0-9]+)|([0-9]*\.[0-9]+)) SLIT \"[^"\n]*["\n] IDENT [a-z][a-z0-9]* %% {NLIT} { yylval.number = atof(yytext); return(NUMLIT); } {SLIT} { if(yytext[yyleng-1] == '\n') unput('\n'); yylval.string = (char *)malloc(yyleng-1); strcpy(yylval.string,&yytext[1]); yylval.string[strlen(yylval.string)-1] = 0; return STRLIT; } cls return CLS; dim return DIM; as return AS; number return NUMBER; string return STRING; boolean return BOOLEAN; input return INPUT; print return(PRINT); ; return ';'; if { BEGIN BEXPR; return(IF); } = return(EQ); >= return(GE); \<= return(LE); \<> return(NE); \< return(LT); > return(GT); and return(AND); or return(OR); not return(NOT); true { yylval.boolean = 1; return(BOOLIT); } false { yylval.boolean = 0; return(BOOLIT); } then { BEGIN 0; return(THEN); } else printf("ELSE "); end[ \t]+if printf("ENDIF "); = return '='; : printf("LABEL "); goto printf("GOTO "); gosub printf("GOSUB "); return printf("RETURN "); {IDENT} { yylval.boolean = VarKey(yytext); if(!yylval.boolean) { yylval.string = (char *)malloc(strlen(yytext)+1); strcpy(yylval.string,yytext); return UNREC; } else { switch(TypeOf(yylval.boolean)) { case TP_STRING: return SVAR; break; case TP_NUMBER: return NVAR; break; case TP_BOOLEAN: return BVAR; break; } } } "+" return '+'; "-" return '-'; "*" return '*'; "/" return '/'; "^" return '^'; "(" return '('; ")" return ')'; (rem.*\n)|('.*\n) unput('\n'); \n return EOL; [ \t]+ /* eat up whitespace */ . printf("Syntax Error: \"%s\"\n", yytext); %% main(int argc, char **argv) { if(argc > 1) { yyin = fopen(argv[argc-1],"r"); if(yyin == NULL) { printf("Error trying to read \"%s\".\n",argv[argc-1]); return; } } else yyin = stdin; yyparse(); close(yyin); } /*=====<< Indicate Source Code is Finished >>=====*/ int yywrap() { return 1; }