%option stack %x comment %x api_entry %x api_entry2 %x api_entry_param %x var_type DIGIT [0-9] ID [a-zA-Z_][a-zA-Z0-9_]* #include "spec.h" int num_lines = 0; VarType *currType = 0; ApiEntry apis[128]; int apiCount = 0; int typeNextState; void checkPointerType() { VarType *baseType = currType; int curPtrLevel = 0; while (curPtrLevel < baseType->ptrLevel) { currType = &apis[apiCount].params[apis[apiCount].paramCount]; currType->type = 4; currType->ptrLevel = curPtrLevel; if (currType->ptrLevel > 0) { currType->isConst = 1; } sprintf(currType->typeName, "%s", "size_t"); switch(baseType->ptrLevel - curPtrLevel) { case 1: sprintf(currType->name, "%s_length", baseType->name); break; case 2: sprintf(currType->name, "%s_length_length", baseType->name); break; } apis[apiCount].paramCount++; curPtrLevel ++; } } int yylex(); %% "/*" BEGIN(comment); <comment>[^*\n]* /* eat anything that's not a '*' */ <comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */ <comment>\n ++num_lines; <comment>"*"+"/" BEGIN(INITIAL); <*>" " //printf("found ' '\n"); <*>"\t" //printf("found ' '\n"); <*>"\n" ++num_lines; //printf("found lf \n"); {ID} { memset(&apis[apiCount], 0, sizeof(ApiEntry)); memcpy(apis[apiCount].name, yytext, yyleng); BEGIN(api_entry); } <api_entry>"{" { BEGIN(api_entry2); } <api_entry2>"sync" { apis[apiCount].sync = 1; } <api_entry2>"handcodeApi" { apis[apiCount].handcodeApi = 1; } <api_entry2>"direct" { apis[apiCount].direct = 1; } <api_entry2>"nocontext" { apis[apiCount].nocontext = 1; } <api_entry2>"ret" { currType = &apis[apiCount].ret; typeNextState = api_entry2; BEGIN(var_type); } <api_entry2>"param" { currType = &apis[apiCount].params[apis[apiCount].paramCount]; apis[apiCount].paramCount++; typeNextState = api_entry_param; BEGIN(var_type); } <var_type>"const" { currType->isConst = 1; } <var_type>"i8" { currType->type = 1; currType->bits = 8; BEGIN(typeNextState); } <var_type>"i16" { currType->type = 1; currType->bits = 16; BEGIN(typeNextState); } <var_type>"i32" { currType->type = 1; currType->bits = 32; BEGIN(typeNextState); } <var_type>"i64" { currType->type = 1; currType->bits = 64; BEGIN(typeNextState); } <var_type>"u8" { currType->type = 2; currType->bits = 8; BEGIN(typeNextState); } <var_type>"u16" { currType->type = 2; currType->bits = 16; BEGIN(typeNextState); } <var_type>"u32" { currType->type = 2; currType->bits = 32; BEGIN(typeNextState); } <var_type>"u64" { currType->type = 2; currType->bits = 64; BEGIN(typeNextState); } <var_type>"f" { currType->type = 3; currType->bits = 32; BEGIN(typeNextState); } <var_type>"d" { currType->type = 3; currType->bits = 64; BEGIN(typeNextState); } <var_type>{ID} { currType->type = 4; currType->bits = 32; memcpy(currType->typeName, yytext, yyleng); BEGIN(typeNextState); } <api_entry_param>"*" { currType->ptrLevel ++; } <api_entry_param>{ID} { memcpy(currType->name, yytext, yyleng); checkPointerType(); BEGIN(api_entry2); } <api_entry2>"*" { currType->ptrLevel ++; } <api_entry2>"}" { apiCount++; BEGIN(INITIAL); } <*>. { fprintf(stderr, "error: unexpected character \'%c\' at line %d\n", *yytext, num_lines + 1); exit(1); } %% int yywrap() { return 1; }