parser/c_compiler/lexer.l
author Markus Bröker <mbroeker@largo.dyndns.tv>
Mon, 09 Sep 2013 15:51:32 +0200
changeset 166 ecd6492274ad
parent 39 46d7ec9d63bd
permissions -rw-r--r--
Test committer: Markus Bröker <mbroeker@largo.homelinux.org>

%{
    #include <prototypes.h>
    #include "parser.h"
    int column = 0;
    int c;
%}

D                        [0-9]
L                        [a-zA-Z_]
H                        [a-fA-F0-9]
E                        [Ee][+-]?{D}+
FS                       (f|F|l|L)
IS                       (u|U|l|L)*

%%
"/*"                     { comment(); }
"#include <"             { c = input(); while ( c != '>') c = input();  }
"#include \""            { c = input(); while ( c != '\"') c = input(); }

"auto"                   { count(); return(AUTO); }
"break"                  { count(); return(BREAK); }
"case"                   { count(); return(CASE); }
"char"                   { count(); return(CHAR); }
"const"                  { count(); return(CONST); }
"continue"               { count(); return(CONTINUE); }
"default"                { count(); return(DEFAULT); }
"do"                     { count(); return(DO); }
"double"                 { count(); return(DOUBLE); }
"else"                   { count(); return(ELSE); }
"enum"                   { count(); return(ENUM); }
"extern"                 { count(); return(EXTERN); }
"float"                  { count(); return(FLOAT); }
"for"                    { count(); return(FOR); }
"goto"                   { count(); return(GOTO); }
"if"                     { count(); return(IF); }
"int"                    { count(); return(INT); }
"long"                   { count(); return(LONG); }
"register"               { count(); return(REGISTER); }
"return"                 { count(); return(RETURN); }
"short"                  { count(); return(SHORT); }
"signed"                 { count(); return(SIGNED); }
"sizeof"                 { count(); return(SIZEOF); }
"static"                 { count(); return(STATIC); }
"struct"                 { count(); return(STRUCT); }
"switch"                 { count(); return(SWITCH); }
"typedef"                { count(); return(TYPEDEF); }
"union"                  { count(); return(UNION); }
"unsigned"               { count(); return(UNSIGNED); }
"void"                   { count(); return(VOID); }
"volatile"               { count(); return(VOLATILE); }
"while"                  { count(); return(WHILE); }

{L}({L}|{D})*            { count(); return(check_type()); }
0[xX]{H}+{IS}?           { count(); return(CONSTANT); }
0{D}+{IS}?               { count(); return(CONSTANT); }
{D}+{IS}?                { count(); return(CONSTANT); }
'(\\.|[^\\'])+'          { count(); return(CONSTANT); }

{D}+{E}{FS}?             { count(); return(CONSTANT); }
{D}*"."{D}+({E})?{FS}?   { count(); return(CONSTANT); }
{D}+"."{D}*({E})?{FS}?   { count(); return(CONSTANT); }

\"(\\.|[^\\"])*\"        { count(); return(STRING_LITERAL); }

">>="                    { count(); return(RIGHT_ASSIGN); }
"<<="                    { count(); return(LEFT_ASSIGN); }
"+="                     { count(); return(ADD_ASSIGN); }
"-="                     { count(); return(SUB_ASSIGN); }
"*="                     { count(); return(MUL_ASSIGN); }
"/="                     { count(); return(DIV_ASSIGN); }
"%="                     { count(); return(MOD_ASSIGN); }
"&="                     { count(); return(AND_ASSIGN); }
"^="                     { count(); return(XOR_ASSIGN); }
"|="                     { count(); return(OR_ASSIGN); }
">>"                     { count(); return(RIGHT_OP); }
"<<"                     { count(); return(LEFT_OP); }
"++"                     { count(); return(INC_OP); }
"--"                     { count(); return(DEC_OP); }
"->"                     { count(); return(PTR_OP); }
"&&"                     { count(); return(AND_OP); }
"||"                     { count(); return(OR_OP); }
"<="                     { count(); return(LE_OP); }
">="                     { count(); return(GE_OP); }
"=="                     { count(); return(EQ_OP); }
"!="                     { count(); return(NE_OP); }
";"                      { count(); return(';'); }
"{"                      { count(); return('{'); }
"}"                      { count(); return('}'); }
","                      { count(); return(','); }
":"                      { count(); return(':'); }
"="                      { count(); return('='); }
"("                      { count(); return('('); }
")"                      { count(); return(')'); }
"["                      { count(); return('['); }
"]"                      { count(); return(']'); }
"."                      { count(); return('.'); }
"&"                      { count(); return('&'); }
"!"                      { count(); return('!'); }
"~"                      { count(); return('~'); }
"-"                      { count(); return('-'); }
"+"                      { count(); return('+'); }
"*"                      { count(); return('*'); }
"/"                      { count(); return('/'); }
"%"                      { count(); return('%'); }
"<"                      { count(); return('<'); }
">"                      { count(); return('>'); }
"^"                      { count(); return('^'); }
"|"                      { count(); return('|'); }
"?"                      { count(); return('?'); }
[ \t\v\n\f]              { count(); }
.                        { printf ("Unknown Token: %s\n", yytext); }
%%

int yywrap()
{
    /* stop after eof */
    return 1;
}

int count()
{
    int i;

    for (i = 0; yytext[i] != '\0'; i++)
        if (yytext[i] == '\n')
            column = 0;
        else if (yytext[i] == '\t')
            column += 4 - (column % 4);
        else
            column++;

    return column;
}

int check_type()
{
    return IDENTIFIER;
}

void comment()
{
    int c;

    c = input();
    do {
        while ( c != '*')
            c = input();
        c=input();
    } while(c != '/');
}