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 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() {

View File

@ -16,6 +16,10 @@ extern FILE *yyin;
%type <str> 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

View File

@ -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;