You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
3.8 KiB
203 lines
3.8 KiB
%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; |
|
} |
|
|
|
|