123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- %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;
- }
|