/* SI 413 Fall 2011 * spl.lpp * This is a scanner specification for the SPL programming language. * The semantic values are wither leaves in the AST or operator codes. */ %{ #include <iostream> #include <cstdlib> using namespace std; #include "value.hpp" #include "ast.hpp" #include "spl.tab.hpp" // Returns the type of comparison operator that we are seeing. Oper getCompOp(const char* text) { switch(text[0]) { case '=': return EQ; case '!': return NE; case '>': return (text[1] == '=' ? GE : GT); case '<': return (text[1] == '=' ? LE : LT); default: exit(1); // never reached } } %} %option noyywrap %% [0-9]+ {yylval.exp = new Num(atoi(yytext)); return NUM;} true|false {yylval.exp = new BoolExp(yytext[0] == 't'); return BOOL;} [+-] {yylval.op = (yytext[0] == '+' ? ADD : SUB); return OPA;} [*/] {yylval.op = (yytext[0] == '*' ? MUL : DIV); return OPM;} and|or {yylval.op = (yytext[0] == 'a' ? AND : OR); return BOP;} not {yylval.op = NOTOP; return NOT;} ":=" {return ASN;} "(" {return LP;} ")" {return RP;} "{" {return LC;} "}" {return RC;} ";" {return STOP;} [><=]|([><!]=) {yylval.op = getCompOp(yytext); return COMP;} if {return IF;} else {return ELSE;} while {return WHILE;} read {return READ;} write {return WRITE;} lambda {return LAMBDA;} new {return NEW;} [a-zA-Z0-9_]+ {yylval.id = new Id(yytext); return ID;} <<EOF>> { return 0; } [ \t\n]+ { } "#".* { } . { cerr << "Unrecognized token!" << endl; exit(1); } %%