Slightly improved version of the parser
This commit is contained in:
		@@ -17,13 +17,22 @@ int main(int argc, char *argv[]) {
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  // run_interpreter(argc, argv);
 | 
					  // run_interpreter(argc, argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ExprPtr literal = std::make_shared<Expr>(ExprType::LITERAL, Literal{123});
 | 
					  ExprPtr left = std::make_shared<Expr>(
 | 
				
			||||||
  ExprPtr left = std::make_shared<Expr>(ExprType::UNARY, Unary{Token{TokenType::MINUS, "-", Object{}, 1}, literal});
 | 
					    make_expr(
 | 
				
			||||||
 | 
					      Unary{
 | 
				
			||||||
 | 
					        Token{TokenType::MINUS, "-", Object{}, 1},
 | 
				
			||||||
 | 
					        std::make_shared<Expr>(make_expr(Literal{123}))
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Token op{TokenType::STAR, "*", Object{}, 1};
 | 
					  Token op{TokenType::STAR, "*", Object{}, 1};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ExprPtr gliteral = std::make_shared<Expr>(ExprType::LITERAL, Literal{45.67});
 | 
					  ExprPtr right = std::make_shared<Expr>(
 | 
				
			||||||
  ExprPtr right = std::make_shared<Expr>(ExprType::GROUPING, gliteral);
 | 
					    make_expr(
 | 
				
			||||||
 | 
					      Grouping{std::make_shared<Expr>(make_expr(Literal{45.67}))}
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Expr expr = {ExprType::BINARY, Binary{left, op, right}};
 | 
					  Expr expr = {ExprType::BINARY, Binary{left, op, right}};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,26 @@
 | 
				
			|||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
#include <sstream>
 | 
					#include <sstream>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <>
 | 
				
			||||||
 | 
					Expr make_expr<Binary>(Binary value) {
 | 
				
			||||||
 | 
					  return Expr(ExprType::BINARY, value);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <>
 | 
				
			||||||
 | 
					Expr make_expr<Grouping>(Grouping value) {
 | 
				
			||||||
 | 
					  return Expr(ExprType::GROUPING, value);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <>
 | 
				
			||||||
 | 
					Expr make_expr<Literal>(Literal value) {
 | 
				
			||||||
 | 
					  return Expr(ExprType::LITERAL, value);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <>
 | 
				
			||||||
 | 
					Expr make_expr<Unary>(Unary value) {
 | 
				
			||||||
 | 
					  return Expr(ExprType::UNARY, value);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::string AstPrinter::print(const Expr &expr) {
 | 
					std::string AstPrinter::print(const Expr &expr) {
 | 
				
			||||||
  switch (expr.type) {
 | 
					  switch (expr.type) {
 | 
				
			||||||
    case ExprType::BINARY: {
 | 
					    case ExprType::BINARY: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,6 +52,9 @@ struct Expr {
 | 
				
			|||||||
  Expression value;
 | 
					  Expression value;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <typename T>
 | 
				
			||||||
 | 
					Expr make_expr(T value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AstPrinter {
 | 
					class AstPrinter {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
  std::string print(const Expr &expr);
 | 
					  std::string print(const Expr &expr);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user