%{ #include #include #include #include #include "lex.h" //Symbol table (implemented as linked list) list_head_t* head; %} /* Definitions */ delim [ \t\n] ws {delim}+ id [A-Za-z][A-Za-z0-9]* num [0-9]+ real [0-9]*\.[0-9]* basic int|float com (("//".*\n)|("/*".*"*/")) %% {ws} {} {com} {} "if" {yylval=NULL; /*printf("lex:\tif\n",yytext);*/return (IF);} "else" {yylval=NULL; /*printf("lex:\telse\n",yytext);*/return (ELSE);} "while" {yylval=NULL; /*printf("lex:\twhile\n",yytext);*/return (WHILE);} "do" {yylval=NULL; /*printf("lex:\tdo\n",yytext);*/return (DO);} "break" {yylval=NULL; /*printf("lex:\tbreak\n",yytext);*/return (BREAK);} {basic} {if(strcmp(yytext, "int") == 0) yylval = (void*) &int_var; else yylval = (void*) &float_var; /*printf("lex:\tbasic\\n",yylval)*/;return (BASIC);} "true" {yylval=(void *)&true_var; /*printf("lex:\t%s\n",yytext);*/return (BOOL);} "false" {yylval=(void *)&false_var; /*printf("lex:\t%s\n",yytext);*/return (BOOL);} {id} {yylval=(void *)installID(); /*printf("lex:\tid\n");*/return (ID);} {num} {yylval=(void *)parseNum(); /*printf("lex:\tnum\n");*/return (NUM);} {real} {yylval=(void *)parseReal(); /*printf("lex:\treal\n");*/return (REAL);} "<=" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (LE);} "<" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (LT);} ">=" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (GE);} ">" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (GT);} "==" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (EQUALTO);} "!=" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (NOTEQUAL);} "(" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (OPENPAREN);} ")" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (CLOSEPAREN);} "]" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (CLOSEBRACKET);} "[" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (OPENBRACKET);} "}" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (CLOSEBRACE);} "{" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (OPENBRACE);} "&&" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (AND);} "||" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (OR);} ";" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (SEMI);} "+" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (PLUS);} "-" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (MINUS);} "*" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (MULTI);} "/" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (DIV);} "!" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (NOT);} "=" {yylval=NULL; /*printf("lex:\t%s\n",yytext);*/return (EQUALS);} %% //If id is not already in symbol table, insert. Return pointer to symbol table entry void* installID(){ //printf("install id: %s\n",yytext); char* key=calloc(strlen(yytext),sizeof(char)); //Copy token to key strcpy(key, yytext); //printf("Token key: %s\n",key); //search for key list_entry_t* entry=list_search_entry(head, key); //If key doesn't exist, add it to symbol table and return entry pointer if(entry==NULL) return (void*)list_insert(head, key, NULL); //Else return pointer to existing entry return (void*)entry; } //Parse integer from code at yytext void* parseNum(){ int* i=malloc(sizeof(int)); *i=atoi(yytext); return (void*)i; } //Parse float from code at yytext void* parseReal(){ float* r=malloc(sizeof(float));; *r=atof(yytext); return (void*)r; } int yywrap(){return 1;} //Used for searching table int cmp_string( const void *a, const void *b) { assert(a!=NULL); assert(b!=NULL); return strcmp(a,b); }