/* -*- C++ -*- */ %{ #define YY_NO_UNPUT #include using namespace std; #include "ast.hh" using namespace ast; #include "parser.h" int lex_get_line (void); static int current_line = 1; %} D [0-9] L [a-zA-Z_] ID {L}({D}|{L})* INTEGER ([0-9]+) %% ;.* // comment "," return ','; "[" return '['; "]" return ']'; "(" return '('; ")" return ')'; "{" return '{'; "}" return '}'; "!" return '!'; "=" return '='; "<" return '<'; ">" return '>'; "<=" return LTE; ">=" return GTE; "!=" return NEQ; "+" return '+'; "-" return '-'; "*" return '*'; "/" return '/'; ":" return ':'; "globals" return GLOBALS; "parameters" return PARAMETERS; "locals" return LOCALS; "in" return IN; "end" return END; "val" return VAL; "matrix" return MATRIX; "fun" return FUN; "char" return CHAR; "int" return INT; "float" return FLOAT; "where" return WHERE; "when" return WHEN; "and" return AND; "or" return OR; "true" return TRUE; {INTEGER} yylval.integer = atoi(yytext); return INTEGER; {ID} yylval.str = strdup(yytext); return ID; \n current_line++; [\t ] // ignore whitespace . { cerr << "illegal character in input `" << yytext[0] << "' at line `" << current_line << "'\n"; exit(1); } %% int yywrap (void) { return 1; } int lex_get_line (void) { return current_line; }