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.
204 lines
3.8 KiB
204 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;
|
|
}
|
|
|