/* Dinko Korunic, Fri Mar 30 18:54:40 CEST 2001 Mostly accrording to literature and ANSI-C grammar */ %option case-sensitive %{ #include #include #define lexd(t) { fprintf(stderr, t); } void count(void); void comment(void); void cpp(void); int column=0, newrow=1, row=0; %} digit [0-9] letter [a-zA-Z_] hex [a-fA-F0-9] exponent [Ee][+-]?{digit}+ FS (f|F|l|L) IS (u|U|l|L)* %% "/*" { count(); lexd("COMMENT "); comment(); } "#" { count(); lexd("CPP_DIRECTIVE "); cpp(); } "auto" { count(); lexd("AUTO "); } "break" { count(); lexd("BREAK "); } "case" { count(); lexd("CASE "); } "char" { count(); lexd("CHAR "); } "const" { count(); lexd("CONST "); } "continue" { count(); lexd("CONTINUE "); } "default" { count(); lexd("DEFAULT "); } "do" { count(); lexd("DO "); } "double" { count(); lexd("DOUBLE "); } "else" { count(); lexd("ELSE "); } "enum" { count(); lexd("ENUM "); } "extern" { count(); lexd("EXTERN "); } "float" { count(); lexd("FLOAT "); } "for" { count(); lexd("FOR "); } "goto" { count(); lexd("GOTO "); } "if" { count(); lexd("IF "); } "int" { count(); lexd("INT "); } "long" { count(); lexd("LONG "); } "register" { count(); lexd("REGISTER "); } "return" { count(); lexd("RETURN "); } "short" { count(); lexd("SHORT "); } "signed" { count(); lexd("SIGNED "); } "sizeof" { count(); lexd("SIZEOF "); } "static" { count(); lexd("STATIC "); } "struct" { count(); lexd("STRUCT "); } "switch" { count(); lexd("SWITCH "); } "typedef" { count(); lexd("TYPEDEF "); } "union" { count(); lexd("UNION "); } "unsigned" { count(); lexd("UNSIGNED "); } "void" { count(); lexd("VOID "); } "volatile" { count(); lexd("VOLATILE "); } "while" { count(); lexd("WHILE "); } {letter}({letter}|{digit})* { count(); lexd("IDENTIFIER "); } 0[xX]{hex}+{IS}? { count(); lexd("CONSTANT "); } 0{digit}+{IS}? { count(); lexd("CONSTANT "); } {digit}+{IS}? { count(); lexd("CONSTANT "); } {letter}?'(\\.|[^\\'])+' { count(); lexd("CONSTANT "); } {digit}+{exponent}{FS}? { count(); lexd("CONSTANT "); } {digit}*"."{digit}+({exponent})?{FS}? { count(); lexd("CONSTANT "); } {digit}+"."{digit}*({exponent})?{FS}? { count(); lexd("CONSTANT "); } {letter}?\"(\\.|[^\\"])*\" { count(); lexd("STRING_LITERAL "); } "..." { count(); lexd("ELLIPSIS "); } ">>=" { count(); lexd("RIGHT_ASSIGN "); } "<<=" { count(); lexd("LEFT_ASSIGN "); } "+=" { count(); lexd("ADD_ASSIGN "); } "-=" { count(); lexd("SUB_ASSIGN "); } "*=" { count(); lexd("MUL_ASSIGN "); } "/=" { count(); lexd("DIV_ASSIGN "); } "%=" { count(); lexd("MOD_ASSIGN "); } "&=" { count(); lexd("AND_ASSIGN "); } "^=" { count(); lexd("XOR_ASSIGN "); } "|=" { count(); lexd("OR_ASSIGN "); } ">>" { count(); lexd("RIGHT_OP "); } "<<" { count(); lexd("LEFT_OP "); } "++" { count(); lexd("INC_OP "); } "--" { count(); lexd("DEC_OP "); } "->" { count(); lexd("PTR_OP "); } "&&" { count(); lexd("AND_OP "); } "||" { count(); lexd("OR_OP "); } "<=" { count(); lexd("LE_OP "); } ">=" { count(); lexd("GE_OP "); } "==" { count(); lexd("EQ_OP "); } "!=" { count(); lexd("NE_OP "); } ";" { count(); lexd("; "); } ("{"|"<% ") { count(); lexd("{ "); } ("}"|"%> ") { count(); lexd("} "); } "," { count(); lexd(", "); } ":" { count(); lexd(": "); } "=" { count(); lexd("= "); } "(" { count(); lexd("( "); } ")" { count(); lexd(") "); } ("["|"<: ") { count(); lexd("[ "); } ("]"|":> ") { count(); lexd("] "); } "." { count(); lexd(". "); } "&" { count(); lexd("& "); } "!" { count(); lexd("! "); } "~" { count(); lexd("~ "); } "-" { count(); lexd("- "); } "+" { count(); lexd("+ "); } "*" { count(); lexd("* "); } "/" { count(); lexd("/ "); } "%" { count(); lexd("%% "); } "<" { count(); lexd("< "); } ">" { count(); lexd("> "); } "^" { count(); lexd("^ "); } "|" { count(); lexd("| "); } "?" { count(); lexd("? "); } [ \t\v\f] { count(); } "\r\n" { count(); ++newrow; fprintf(stderr, "\n"); } "\n" { count(); ++newrow; fprintf(stderr, "\n"); } . { /* ignore_bad_characters(); */ } %% int yywrap(void) { return 1; } void comment(void) { int c; while (1) { while ((c=input())!='*' && c!=EOF) /* eat up text of comment */ if (c=='\n') ++row; if (c=='*') { while ((c=input())=='*'); if (c=='/') break; /* found the end */ } if (c==EOF) { error("EOF in comment"); break; } } } void cpp(void) { int c; while ((c=input())!='\n' && c!=EOF); unput(c); } void count(void) { int i; for (i=0; yytext[i]!='\0'; i++) if (yytext[i]=='\n') column=0; else if (yytext[i]=='\t') column+=8-(column%8); else column++; if (newrow) { fprintf(stderr, "%d: ", row+=newrow); newrow=0; } } int main(int argc, char **argv) { if (argc>1) yyin=fopen(argv[1], "r"); else yyin=stdin; yylex(); }