%{ #include #define IDENTIFIER 100 #define VALUE 101 #define PLUS 102 #define MINUS 103 #define DIVIDE 104 #define TIMES 105 #define LESS 106 #define GREATER 107 #define LESSEQ 108 #define GREATEREQ 109 #define EQUALS 110 #define NEQUALS 111 #define AND 112 #define OR 113 #define NOT 114 #define SEMICOLON 115 #define ASSIGN 116 #define OPENPAREM 117 #define ENDPAREM 118 #define BEGINTOK 119 #define END 120 #define IF 121 #define THEN 122 #define ELSE 123 #define WHILE 124 #define DO 125 #define PRINT 126 #define INPUT 127 #define COMMENT 128 #define ERROR 129 #define WHITESPACE 130 #define LAMBDA 131 #define COLON 132 %} ALPHA [a-zA-Z] DIGIT [0-9] %option noyywrap %% "+" {return PLUS; } "-" {return MINUS;} "/" {return DIVIDE;} "*" {return TIMES;} "!" {return NOT;} "(" {return OPENPAREM;} ")" {return ENDPAREM;} ";" {return SEMICOLON;} %.*\n {} // Comments "<" {return LESS;} ">" {return GREATER;} "<=" {return LESSEQ;} ">=" {return GREATEREQ;} "==" {return EQUALS;} "!=" {return NEQUALS;} "&&" {return AND;} "||" {return OR;} ":=" {return ASSIGN;} "if" {return IF;} "do" {return DO;} "end" {return END;} "then" {return THEN;} "else" {return ELSE;} "begin" {return BEGINTOK;} "while" {return WHILE;} "print" {return PRINT;} "input" {return INPUT;} "lambda" {return LAMBDA;} ":" {return COLON;} "true" {return VALUE;} "false" {return VALUE;} \".*\" {return VALUE; } {DIGIT} {return VALUE;} {DIGIT}*"."?{DIGIT}+ {return VALUE;} [_a-zA-Z][_a-zA-Z0-9]* {return IDENTIFIER;} [\n] { } [ \t\r]+ {} . {printf("Error: invlaid lexeme '%s'.\n", yytext); return 0;} %% int main(int argc, char* argv[]) { if (argc != 2) { printf("Incorrect number of arguments passed. Expected %d, got %d.\n", 1, argc - 1); printf("Usage: lexer [program_name].sl\n"); exit(-1); } stdin = fopen(argv[1], "r"); int token; do { token = yylex(); if (token == ERROR) { exit(-1); } // Ignore Comments and Whitespace if (token != COMMENT && token != WHITESPACE) { printf("%d\n", token); } } while(token != 0); return 0; }