/* Lexical Analysis with Flex (1.6.0) We used some of the code from this manual */ /* so we placed the citation here. */ /* definitions */ %option noyywrap %{ #include "typedefs.h" %} int line_number = 1, column_number = 1; DIGIT [0-9] CHAR \\n|\\t|\\'|[^'\n\t\\] /* char can be a newline, tab, an escaped quote, or anything but a single quote, an actual line break, an actual tab, or a backslash by itself (to prevent confusion from escaped quote */ SCHAR \\n|\\t|\\\"|[^\"\n\\] /*similar to above, a string Char (SCHAR) is the same as a CHAR except we cannot have double quotes instead of single quotes. Double quotes need to be escaped in Flex unlike single quotes based on documentation */ STARTCOM \(\* ENDCOM \*\) COMMENTCHAR [^\*]|\*[^\)] /*Making the contents of a comment anything that is either not a * or not a * followed by ) to terminate comments at the first ENDCOM */ %% \n line_number++ column_number = 1; . column_number++; "integer" {return T_INTEGER} "address" {return T_ADDRESS} "Boolean" {return T_BOOLEAN} "character" {return T_CHARACTER} /* rules */ {DIGIT}+ {printf( "C_INTEGER: %s (%d)\n", yytext, atoi( yytext ) );} "null" {printf( "C_NULL: %s (%d)\n", yytext, atoi( yytext ) );} "while" {return WHILE} "if" {return IF} "then" {return THEN} "else" {return ELSE} "type" {return TYPE} "function" {return FUNCTION} "return" {return RETURN} "external" {return EXTERNAL} "as" {return AS} '{CHAR}' {printf( "C_CHARACTER: %s (%d)\n", yytext, atoi( yytext ) );} /*using double \ per documentation to show escaped chars*/ "true" {printf( "C_TRUE: %s (%d)\n", yytext, atoi( yytext ) );} "false" {printf( "C_FALSE: %s (%d)\n", yytext, atoi( yytext ) );} /* OPERATORS */ "+" {return ADD;} "-" {return SUB_OR_NEG;} "*" {return MUL;} "/" {return DIV;} "%" {return REM;} "<" {return LESS_THAN;} "=" {return EQUAL_TO;} ":=" {return ASSIGN;} "!" {return NOT;} "&" {return AND;} "|" {return OR;} "." {return DOT;} "reserve" {return RESERVE;} "release" {return RELEASE;} \"{SCHAR}*\" {printf( "C_STRING: %s (%d)\n", yytext, atoi( yytext ) );} {STARTCOM}{COMMENTCHAR}*{ENDCOM} {printf( "COMMENT: %s (%d)\n", yytext, atoi( yytext ) );} %%