Some optimizations for DSL compilation. Also a new feature: Inplace addition and subtraction += and -= are now allowed
This commit is contained in:
@@ -51,6 +51,8 @@ L [a-zA-Z_]
|
||||
|
||||
"++" { return INPLACE_INC; }
|
||||
"--" { return INPLACE_DEC; }
|
||||
"+=" { return INPLACE_ADD; }
|
||||
"-=" { return INPLACE_SUB; }
|
||||
|
||||
[-+*/;=\[\]{}(),\.<>] { return yytext[0]; } /* Characters */
|
||||
|
||||
|
@@ -21,7 +21,7 @@ int yyget_lineno();
|
||||
%token IF ELSE FOR WHILE ELIF
|
||||
%token LEQU LAND LOR LLEQU
|
||||
%token KERNEL DEVICE PREPROCESSED
|
||||
%token INPLACE_INC INPLACE_DEC
|
||||
%token INPLACE_INC INPLACE_DEC INPLACE_ADD INPLACE_SUB
|
||||
|
||||
%%
|
||||
|
||||
@@ -188,6 +188,8 @@ binary_operator: '+'
|
||||
| LAND { $$ = astnode_create(NODE_UNKNOWN, NULL, NULL); astnode_set_buffer(yytext, $$); }
|
||||
| LOR { $$ = astnode_create(NODE_UNKNOWN, NULL, NULL); astnode_set_buffer(yytext, $$); }
|
||||
| LLEQU { $$ = astnode_create(NODE_UNKNOWN, NULL, NULL); astnode_set_buffer(yytext, $$); }
|
||||
| INPLACE_ADD { $$ = astnode_create(NODE_UNKNOWN, NULL, NULL); astnode_set_buffer(yytext, $$); }
|
||||
| INPLACE_SUB { $$ = astnode_create(NODE_UNKNOWN, NULL, NULL); astnode_set_buffer(yytext, $$); }
|
||||
;
|
||||
|
||||
unary_operator: '-' /* C-style casts are disallowed, would otherwise be defined here */ { $$ = astnode_create(NODE_UNKNOWN, NULL, NULL); $$->infix = yytext[0]; }
|
||||
|
@@ -66,7 +66,7 @@ static const char* translation_table[TRANSLATION_TABLE_SIZE] = {
|
||||
[COMPLEX] = "acComplex",
|
||||
// Type qualifiers
|
||||
[KERNEL] = "template <int step_number> static __global__",
|
||||
[DEVICE] = "static __device__",
|
||||
[DEVICE] = "static __device__ __forceinline__",
|
||||
[PREPROCESSED] = "static __device__ __forceinline__",
|
||||
[CONSTANT] = "const",
|
||||
[IN] = "in",
|
||||
@@ -138,6 +138,9 @@ static size_t current_nest = 0;
|
||||
static Symbol*
|
||||
symboltable_lookup(const char* identifier)
|
||||
{
|
||||
// TODO assert tha symbol not function! cannot be since we allow overloads->conflicts if not
|
||||
// explicit
|
||||
|
||||
if (!identifier)
|
||||
return NULL;
|
||||
|
||||
@@ -379,6 +382,7 @@ traverse(const ASTNode* node)
|
||||
tmp = tmp->parent;
|
||||
assert(tmp->type = NODE_FUNCTION_DECLARATION);
|
||||
|
||||
// TODO FIX not to use symboltable_lookup
|
||||
const Symbol* parent_function = symboltable_lookup(tmp->lhs->rhs->buffer);
|
||||
assert(parent_function);
|
||||
|
||||
|
Reference in New Issue
Block a user