diff --git a/src/main.cc b/src/main.cc index ce0f85e..decda47 100644 --- a/src/main.cc +++ b/src/main.cc @@ -48,7 +48,7 @@ int main(int argc, char * argv[]) /* Clean up temporary files. */ if (preprocessed_fname_created) { - unlink(preprocessed_fname); + //unlink(preprocessed_fname); } return 0; diff --git a/src/parser/parser.l b/src/parser/parser.l index 39ce1ab..314ab8a 100644 --- a/src/parser/parser.l +++ b/src/parser/parser.l @@ -123,6 +123,8 @@ sizeof return SIZEOF; __attribute__ return ATTRIBUTE; __restrict return RESTRICT; +asm return ASM; +__asm__ return ASM; L?'[^\\]' return CHAR_CONST; L?'\\.' return CHAR_CONST; diff --git a/src/parser/parser.yc b/src/parser/parser.yc index b34190d..48e8aa8 100644 --- a/src/parser/parser.yc +++ b/src/parser/parser.yc @@ -114,6 +114,7 @@ int yylex(YYSTYPE *, YYLTYPE *); %token TYPE_NAME; %token ATTRIBUTE; %token RESTRICT; +%token ASM; %start translation_unit @@ -516,6 +517,7 @@ statement | selection_statement | iteration_statement | jump_statement + | asm_statement ; labeled_statement @@ -567,6 +569,29 @@ jump_statement | RETURN expression SEMICOLON ; +asm_statement + : asm_expression SEMICOLON + ; + +asm_expression + : ASM LPAREN string_literals asm_operands RPAREN + ; + +asm_operands + : + | asm_operand + | asm_operands asm_operand + ; + +asm_operand + : COLON primary_expressions + ; + +primary_expressions + : primary_expression + | primary_expressions primary_expression + ; + translation_unit : external_declaration | translation_unit external_declaration @@ -588,6 +613,8 @@ attributes : { $$ = nullptr; } | attribute_spec | attributes attribute_spec + | asm_expression + | attributes asm_expression ; attribute_spec