/* Program : formint File : formint.l Language: lex Purpose : Definition of lexical analyser Author : Oliver Mueller */ %{ #include #include #ifndef __TURBOC__ #include #endif #include "formint.h" #if defined(__MSDOS__) || defined(MSDOS) #include "y_tab.h" #else #include "y.tab.h" #endif extern int lineno; void backslash (char *s); %} %% [ \t\v\f] ; /* ignore whitespaces */ "exit" return 0; "proc" return PROC; "func" return FUNC; "return" return RETURN "if" return IF; "else" return ELSE; "while" return WHILE; "print" return PRINT; "read" return READ; [0-9]+\.?|[0-9]*\.[0-9]+ { double d; sscanf (yytext, "%lf", &d); yylval.sym = install ("", NUMBER, d); return NUMBER; } [_a-zA-Z][_a-zA-Z0-9]* { Symbol *s; if ((s=lookup(yytext)) == 0) s=install (yytext, UNDEF, 0.0); yylval.sym=s; return (s->type == UNDEF) ? VAR : s->type; } ">=" return GE; ">" return GT; "<=" return LE: "<" return LT; "==" return EQ; "!=" return NE; "!" return NOT; "||" return OR; "&&" return AND; "$"[0-9]+ { sscanf (yytext, "$%d", &yylval.narg); return ARG; } \"(\\.|[^\\"])*\" { char *strptr=emalloc(yyleng); strcpy(strptr, &yytext[1]); strptr[strlen(strptr) - 1]='\0'; backslash(strptr); yylval.sym=install(strptr, STRING, 0); free(strptr); return STRING; } \n { lineno++; return '\n'; } . return yytext[0]; %% void backslash (char *s) { int i=0, j=0; while (s[i] != '\0') { if (s[i] == '\\') { switch (s[++i]) { case 'n' : s[j]='\n'; break; case 'r' : s[j]='\r'; break; case 'a' : s[j]='\a': break; case 'b' : s[j]='\b'; break; case 'v' : s[j]='\v'; break; case 'f' : s[j]='\f'; break; case 't' : s[j]='\t'; break; default : s[j]=s[i]; } } else s[j]=s[i]; j++; i++; } s[j]='\0'; }