@@ -53,10 +53,20 @@ static bool match(TokenType type) {
5353 return false;
5454}
5555
56- static Expr * expression ();
57- static Stmt * statement ();
58- static Stmt * declaration ();
59- static Expr * unary ();
56+ static Expr * expression () {
57+ return binary ();
58+ }
59+
60+ static Expr * unary () {
61+ if (match (TOKEN_MINUS ) {
62+ Expr * expr = malloc (sizeof (Expr ));
63+ expr -> type = EXPR_UNARY ;
64+ expr -> unary .op = parser .previous ;
65+ expr -> unary .right = unary ();
66+ return expr ;
67+ }
68+ return primary ();
69+ }
6070
6171static Expr * binary () {
6272 Expr * expr = unary ();
@@ -89,11 +99,35 @@ static Expr* binary() {
8999 }
90100}
91101
92- static Stmt * parse_statement () {
102+ static Stmt * print_statement () {
103+ Expr * expr = expression ();
104+ consume (TOKEN_SEMICOLON , "Expect ';' after value." );
105+
106+ Stmt * stmt = malloc (sizeof (Stmt ));
107+ stmt -> type = STMT_PRINT ;
108+ stmt -> print .expr = expr ;
109+ return stmt ;
110+ }
111+
112+ static Stmt * expression_statement () {
113+ Expr * expr = expression ();
114+ consume (TOKEN_SEMICOLON , "Expect ';' after expression." );
115+
116+ Stmt * stmt = malloc (sizeof (Stmt ));
117+ stmt -> type = STMT_EXPRESSION ;
118+ stmt -> expression .expr = expr ;
119+ return stmt ;
120+ }
121+
122+ static Stmt * statement () {
93123 if (match (TOKEN_PRINT )) return print_statement ();
94124 return expression_statement ();
95125}
96126
127+ static Stmt * declaration () {
128+ return statement ();
129+ }
130+
97131void init_parser () {
98132 parser .had_error = false;
99133 parser .panic_mode = false;
0 commit comments