%{ #include "mp4.tab.h" void print_unknown(); void print_string(); void print_error(char* type); unsigned int line_number=1; unsigned int column_number=1; unsigned int string_line_number; unsigned int string_column_number; char current_string[5000]; %} digit [0-9] letter [A-Za-z] eol \n %x multiline_comment %x string_type %% char { column_number += yyleng; return CHAR; } class { column_number += yyleng; return CLASS; } else { column_number += yyleng; return ELSE; } if { column_number += yyleng; return IF; } int { column_number += yyleng; return INT; } private { column_number += yyleng; return PRIVATE; } public { column_number += yyleng; return PUBLIC; } return { column_number += yyleng; return RETURN; } void { column_number += yyleng; return VOID; } while { column_number += yyleng; return WHILE; } cin { column_number += yyleng; return CIN; } cout { column_number += yyleng; return COUT; } ({letter}|_)({letter}|{digit}|_)* { column_number += yyleng; return ident; } {digit}+ { column_number += yyleng; return num; } "<<" { column_number += yyleng; return doublelessthan; } "->" { column_number += yyleng; return arrow; } "{" | "}" | "[" | "]" | "(" | ")" | ";" | ":" | "." | "+" | "*" | "/" | "%" | "&" | "|" | "!" | "=" | "<" | ">" | "-" | "," { column_number += yyleng; return yytext[0]; } \'[^\\]\' | \'\\[\'\"\?\\fnrt]\' | \'\\[0-7]{1,3}\' { column_number += yyleng; return charconst; } \'\\. { print_error("Invalid escape sequence"); column_number += yyleng; } \'. { print_error("Invalid character"); column_number += yyleng; } \" BEGIN(string_type); { string_column_number = column_number; string_line_number = line_number; column_number++; current_string[0] = '\0'; } ([^\\\"\n]|\\[\'\"\?\\fnrt]|\\[0-7]{1,3}) { strcat(current_string, yytext); column_number += yyleng; } \\{eol} { column_number = 1; line_number++; } \" BEGIN(INITIAL); { column_number++; return string; } \\. { print_error("Invalid escape sequence"); column_number += yyleng; } {eol} { print_error("Invalid newline within string"); column_number += yyleng; } {eol} { column_number = 1; line_number++; } "/*" BEGIN(multiline_comment); { column_number += 2; } {eol} { column_number = 1; line_number++; } "*/" BEGIN(INITIAL); { column_number += 2; } . { column_number++; } "//".*{eol} { column_number = 1; line_number++; } [ \t\f] { column_number++; } . { print_unknown(); column_number++; } %% void print_unknown() { printf("%-11s %4d %4d \\%o\n", "unknown", line_number, column_number, yytext[0]); } void print_string() { printf("%-11s %4d %4d %s\n", "string", string_line_number, string_column_number, current_string); } void print_error(char* type) { printf("%-11s %4d %4d %s\n", "ERROR", line_number, column_number, type); }