%{ #include #include "types.h" #include "m2.tab.h" #include "globals.h" #include "utility.h" extern int intconvert ( char *, int, int, int ); extern int processstrring ( void ); %} octdigit [0-7] hexdigit [0-9A-F] letter [a-zA-Z] digit [0-9] lord [a-zA-Z0-9] %x comment %% AND {return(ANDSY);} ARRAY {return(ARRAYSY);} BEGIN {return(BEGINSY);} BY {return(BYSY);} CASE {return(CASESY);} CONST {return(CONSTSY);} DEFINITION {return(DEFINITIONSY);} DIV {return(DIVSY);} DO {return(DOSY);} ELSIF {return(ELSIFSY);} ELSE {return(ELSESY);} END {return(ENDSY);} EXIT {return(EXITSY);} FOR {return(FORSY);} FROM {return(FROMSY);} IF {return(IFSY);} IN {return(INSY);} LOOP {return(LOOPSY);} MOD {return(MODSY);} MODULE {return(MODULESY);} NOT {return(NOTSY);} OF {return(OFSY);} OR {return(ORSY);} PROCEDURE {return(PROCEDURESY);} READ {return(READSY);} RECORD {return(RECORDSY);} REPEAT {return(REPEATSY);} RETURN {return(RETURNSY);} SET {return(SETSY);} THEN {return(THENSY);} TO {return(TOSY);} TYPE {return(TYPESY);} UNTIL {return(UNTILSY);} VAR {return(VARSY);} WHILE {return(WHILESY);} WITH {return(WITHSY);} WRITE {return(WRITESY);} WRITELN {return(WRITELNSY);} {letter}({lord})* {yylval.name_ptr = strdup(yytext); return(IDENTSY);} {digit}+ {yylval.int_val = intconvert(yytext, 0, strlen(yytext) - 1, 10); return(INTCONSTSY);} {digit}({hexdigit})*H {yylval.int_val = intconvert(yytext, 0, strlen(yytext) - 2, 16); return(INTCONSTSY);} {octdigit}+B {yylval.int_val = intconvert(yytext, 0, strlen(yytext) - 2, 8); return(INTCONSTSY);} {octdigit}+C {yylval.int_val = intconvert(yytext, 0, strlen(yytext) - 2, 8); return(CHARCONSTSY);} "(*" BEGIN(comment); [^*\n]* /* eat anything that’s not a ’*’ */ "*"+[^*)\n]* /* eat up ’*’s not followed by ’/’s */ \n ++linenbr; "*"+")" BEGIN(INITIAL); \"[^"\n]*\" {return(processstring());} \'[^'\n]*\' {return(processstring());} "<=" {return(LESY);} ">=" {return(GESY);} "<>" {return(NESY);} ":=" {return(ASSIGNSY);} ".." {return(DOTDOTSY);} "+" {return(ADDSY);} "-" {return(MINUSSY);} "*" {return(TIMESSY);} "/" {return(DIVIDESY);} "&" {return(ANDSY);} "~" {return(NOTSY);} "=" {return(EQSY);} "#" {return(NESY);} "<" {return(LTSY);} ">" {return(GTSY);} "(" {return(LPARENSY);} ")" {return(RPARENSY);} "{" {return(LBRACESY);} "}" {return(RBRACESY);} "[" {return(LBRACKETSY);} "]" {return(RBRACKETSY);} "," {return(COMMASY);} ";" {return(SEMICOLONSY);} ":" {return(COLONSY);} "." {return(DOTSY);} "^" {return(CARETSY);} "|" {return(BARSY);} \t {} \n {linenbr++;} " " {} . {error("lex.yy.c", "Illegal character", yytext);} %% /**********************************/ /********** intconvert **********/ /**********************************/ int intconvert (char *text, int start, int finish, int base) { int i, n; for (n = 0, i = start; i <= finish; i++) if (isdigit(text[i])) n = base * n + text[i] - '0'; else n = base * n + text[i] - '7'; return(n); } /* intconvert */ /************************************/ /********* processstring **********/ /************************************/ int processstring ( void ) { int index; char str_temp [MAXSTRING]; if (strlen(yytext) == 3) { yylval.int_val = yytext[1]; return(CHARCONSTSY); } /* then */ else { yylval.name_ptr = strdup(yytext); yylval.name_ptr[0] = '"'; yylval.name_ptr[yyleng-1] = '"'; return(STRINGCONSTSY); } /* else */ } /* processstring */ /******************************/ /********** yywrap **********/ /******************************/ int yywrap () { return(1); } /* yywrap */