| %{ |
| |
| #include <math.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include "goomsl.h" |
| #include "goomsl_private.h" |
| #include "goomsl_yacc.h" |
| void yyerror(char *); |
| void yyparse(void); |
| |
| GoomSL *currentGoomSL; |
| static int string_size; |
| static char string[1024]; |
| %} |
| |
| DIGIT [0-9] |
| XDIGIT [0-9a-f] |
| ID [a-zA-Z_@&][a-zA-Z0-9_\.]* |
| |
| %S C_COMMENT |
| %S LINE_COMMENT |
| %S STRING |
| |
| %% |
| |
| <LINE_COMMENT,C_COMMENT,INITIAL>^[ \t]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } |
| <LINE_COMMENT,C_COMMENT,INITIAL>^[ \t]*"//"[^\n]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } |
| |
| <LINE_COMMENT>\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } |
| <INITIAL>\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } |
| |
| <C_COMMENT>"*/" { BEGIN INITIAL; } |
| <C_COMMENT>\n { ++currentGoomSL->num_lines; } |
| <C_COMMENT,LINE_COMMENT>. { /* eat up comment */ } |
| |
| <INITIAL>"#RST_LINE#" { currentGoomSL->num_lines = 0; } |
| <INITIAL>"#FILE ".*"#" { currentGoomSL->num_lines = 0; /* printf("%s\n", yytext); */ } |
| <INITIAL>"#"[^\n]* { /* ignore preprocessor lines */ } |
| |
| <INITIAL>"/*" { BEGIN C_COMMENT; } |
| <INITIAL>"//" { BEGIN LINE_COMMENT; } |
| <INITIAL>\" { BEGIN STRING; string_size=0; } |
| |
| <STRING>"\\n" { string[string_size++] = '\n'; } |
| <STRING>"\\\"" { string[string_size++] = '\"'; } |
| <STRING>\" { /* fin de la chaine: on cree le pointeur qui va bien */ |
| unsigned int tmp; |
| BEGIN INITIAL; |
| string[string_size]=0; |
| tmp = gsl_malloc(currentGoomSL, string_size+1); |
| strcpy((char*)currentGoomSL->ptrArray[tmp],string); |
| sprintf(yylval.strValue, "0x%08x", tmp); |
| return LTYPE_PTR; |
| } |
| <STRING>. { string[string_size++] = *yytext; } |
| |
| <INITIAL>"float" { return FLOAT_TK; } |
| <INITIAL>"int" { return INT_TK; } |
| <INITIAL>"boolean" { return INT_TK; } |
| <INITIAL>"ptr" { return PTR_TK; } |
| <INITIAL>"string" { return PTR_TK; } |
| <INITIAL>"declare" { return DECLARE; } |
| <INITIAL>"external" { return EXTERNAL; } |
| <INITIAL>"struct" { return STRUCT; } |
| <INITIAL>"not" { return NOT; } |
| <INITIAL>"while" { return WHILE; } |
| <INITIAL>"do" { return DO; } |
| <INITIAL>"for" { return FOR; } |
| <INITIAL>"in" { return IN; } |
| <INITIAL>"true" { strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } |
| <INITIAL>"false" { strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } |
| <INITIAL>{ID} { strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } |
| <INITIAL>{DIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } |
| <INITIAL>\'.\' { sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } |
| <INITIAL>"0x"{XDIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } |
| <INITIAL>{DIGIT}+"."{DIGIT}* { strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } |
| <INITIAL>{DIGIT}+"%" { sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } |
| <INITIAL>"+=" { return PLUS_EQ; } |
| <INITIAL>"*=" { return MUL_EQ; } |
| <INITIAL>"-=" { return SUB_EQ; } |
| <INITIAL>"/=" { return DIV_EQ; } |
| <INITIAL>"<=" { return LOW_EQ; } |
| <INITIAL>">=" { return SUP_EQ; } |
| <INITIAL>"!=" { return NOT_EQ; } |
| <INITIAL>"<>" { return NOT_EQ; } |
| <INITIAL>[ \t]+ /* eat up whitespace */ |
| <INITIAL>. { yylval.charValue = *yytext; return *yytext; } |
| |
| %% |
| |
| |
| int yywrap(void) { return 1; yyunput(0,0); } |
| |