unary plus and unary minus added
parent
c1b1c7ddbf
commit
8de97b2883
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue