unary plus and unary minus added

master
serr 2025-04-01 17:42:42 +03:00
parent c1b1c7ddbf
commit 8de97b2883
3 changed files with 22 additions and 16 deletions

View File

@ -16,22 +16,22 @@ void yyerror(const char *s) {
%} %}
%% %%
"{" { return LBRACE; } "{" { return LBRACE; }
"}" { return RBRACE; } "}" { return RBRACE; }
";" { return SEMICOLON; } ";" { return SEMICOLON; }
"=" { return ASSIGN; } "=" { return ASSIGN; }
"+" { return PLUS; } "+" { return PLUS; }
"-" { return MINUS; } "-" { return MINUS; }
"*" { return MULT; } "*" { return MULT; }
"/" { return DIV; } "/" { return DIV; }
"%" { return MOD; } "%" { return MOD; }
"return" { return RET; } "return" { return RET; }
"print" { return PRINT; } "print" { return PRINT; }
[0-9]+ { yylval.str = strdup(yytext); return NUMBER; } [0-9]+ { yylval.str = strdup(yytext); return NUMBER; }
[a-zA-Z_][a-zA-Z0-9_]* { yylval.str = strdup(yytext); return IDENTIFIER; } [a-zA-Z_][a-zA-Z0-9_]* { yylval.str = strdup(yytext); return IDENTIFIER; }
[ \t] ; [ \t] ;
\n { line_number++; } \n { line_number++; }
. { yyerror("Invalid character"); } . { yyerror("Invalid character"); }
%% %%
int yywrap() { int yywrap() {

View File

@ -16,6 +16,10 @@ extern FILE *yyin;
%type <str> expr program statement block %type <str> expr program statement block
%left PLUS MINUS
%left MULT DIV MOD
%right UNARY
%% %%
// Program - последовательность утверждений // Program - последовательность утверждений
@ -37,6 +41,8 @@ block:
// Возможные выражения // Возможные выражения
expr: expr:
RET { printf("RET\n") } expr // выражение вида return 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 | PRINT { printf("PRINT\n") } expr // выражение вида print expr
| IDENTIFIER { printf("IDENTIFIER(%s)\n", $1); free($1); } ASSIGN { printf("ASSIGN\n"); } expr // выражения вида a=expr | IDENTIFIER { printf("IDENTIFIER(%s)\n", $1); free($1); } ASSIGN { printf("ASSIGN\n"); } expr // выражения вида a=expr
| expr PLUS { printf("PLUS\n") } expr // выражения вида expr+expr | expr PLUS { printf("PLUS\n") } expr // выражения вида expr+expr

View File

@ -1,11 +1,11 @@
{ {
x = 2 + 1; x = 2 + 1 % 1;
x = z + 3 + 5; x = z + 3 + 5;
{ {
x = 10; x = -10;
y = x + 5 % 2; y = x + 5 % 2;
{ {
z = y * 2 / 5 * 3; z = y * +2 / 5 * 3;
} }
} }
print x; print x;