diff --git a/analyzers/c_analyzer/c_analyzer.l b/analyzers/c_analyzer/c_analyzer.l index f67ba6b..4be2fc6 100644 --- a/analyzers/c_analyzer/c_analyzer.l +++ b/analyzers/c_analyzer/c_analyzer.l @@ -16,22 +16,22 @@ void yyerror(const char *s) { %} %% -"{" { return LBRACE; } -"}" { return RBRACE; } -";" { return SEMICOLON; } -"=" { return ASSIGN; } -"+" { return PLUS; } -"-" { return MINUS; } -"*" { return MULT; } -"/" { return DIV; } -"%" { return MOD; } +"{" { return LBRACE; } +"}" { return RBRACE; } +";" { return SEMICOLON; } +"=" { return ASSIGN; } +"+" { return PLUS; } +"-" { return MINUS; } +"*" { return MULT; } +"/" { return DIV; } +"%" { return MOD; } "return" { return RET; } -"print" { return PRINT; } -[0-9]+ { yylval.str = strdup(yytext); return NUMBER; } +"print" { return PRINT; } +[0-9]+ { yylval.str = strdup(yytext); return NUMBER; } [a-zA-Z_][a-zA-Z0-9_]* { yylval.str = strdup(yytext); return IDENTIFIER; } [ \t] ; -\n { line_number++; } -. { yyerror("Invalid character"); } +\n { line_number++; } +. { yyerror("Invalid character"); } %% int yywrap() { diff --git a/analyzers/c_analyzer/c_analyzer.y b/analyzers/c_analyzer/c_analyzer.y index 4a3d910..39a316c 100644 --- a/analyzers/c_analyzer/c_analyzer.y +++ b/analyzers/c_analyzer/c_analyzer.y @@ -16,6 +16,10 @@ extern FILE *yyin; %type expr program statement block +%left PLUS MINUS +%left MULT DIV MOD +%right UNARY + %% // Program - последовательность утверждений @@ -37,6 +41,8 @@ block: // Возможные выражения expr: RET { printf("RET\n") } expr // выражение вида return expr + | PLUS { printf("UNARY PLUS\n"); } expr %prec UNARY + | MINUS { printf("UNARY MINUS\n"); } expr %prec UNARY | PRINT { printf("PRINT\n") } expr // выражение вида print expr | IDENTIFIER { printf("IDENTIFIER(%s)\n", $1); free($1); } ASSIGN { printf("ASSIGN\n"); } expr // выражения вида a=expr | expr PLUS { printf("PLUS\n") } expr // выражения вида expr+expr diff --git a/code.txt b/code.txt index 96902b3..c4541ed 100644 --- a/code.txt +++ b/code.txt @@ -1,11 +1,11 @@ { - x = 2 + 1; + x = 2 + 1 % 1; x = z + 3 + 5; { - x = 10; + x = -10; y = x + 5 % 2; { - z = y * 2 / 5 * 3; + z = y * +2 / 5 * 3; } } print x;