12 /// identifier_expr: identifier | identifier '(' expression* ')'
13 ex parser::parse_identifier_expr()
15 std::string name = scanner->str;
16 get_next_tok(); // eat identifier.
18 if (token != '(') // symbol
19 return find_or_insert_symbol(name, syms, strict);
21 // function/ctor call.
22 get_next_tok(); // eat (
26 ex e = parse_expression();
33 Parse_error("expected ')' or ',' in argument list");
40 prototype the_prototype = make_pair(name, args.size());
41 prototype_table::const_iterator reader = funcs.find(the_prototype);
42 if (reader == funcs.end()) {
43 Parse_error_("no function \"" << name << "\" with " <<
44 args.size() << " arguments");
46 ex ret = reader->second(args);
50 /// paren_expr: '(' expression ')'
51 ex parser::parse_paren_expr()
53 get_next_tok(); // eat (.
54 ex e = parse_expression();
57 Parse_error("expected ')'");
58 get_next_tok(); // eat ).
62 extern numeric* _num_1_p;
64 /// unary_expr: [+-] expression
65 ex parser::parse_unary_expr(const int s)
67 // consume '-' (or '+')
69 ex v = parse_expression();
72 return (new mul(v, *_num_1_p))->setflag(status_flags::dynallocated);
76 Parse_error_("invalid unary operator \"" << char(s) << "\"");
80 /// primary: identifier_expr | number_expr | paren_expr | unary_expr
81 ex parser::parse_primary()
84 case lexer::token_type::identifier:
85 return parse_identifier_expr();
86 case lexer::token_type::number:
87 return parse_number_expr();
89 return parse_paren_expr();
91 return parse_unary_expr('-');
93 return parse_unary_expr('+');
94 case lexer::token_type::literal:
95 return parse_literal_expr();
96 case lexer::token_type::eof:
98 Parse_error("unexpected token");
102 /// expression ::= primary binoprhs
103 ex parser::parse_expression()
105 ex lhs = parse_primary();
106 ex res = parse_binop_rhs(0, lhs);
110 /// number_expr: number
111 ex parser::parse_number_expr()
113 ex n = numeric(scanner->str.c_str());
114 get_next_tok(); // consume the number
118 /// literal_expr: 'I' | 'Pi' | 'Euler' | 'Catalan'
119 ex parser::parse_literal_expr()
121 if (scanner->str == "I")
123 else if (scanner->str == "Pi")
125 else if (scanner->str == "Euler")
127 else if (scanner->str == "Catalan")
129 bug("unknown literal: \"" << scanner->str << "\"");
132 ex parser::operator()(std::istream& input)
134 scanner->switch_input(&input);
136 ex ret = parse_expression();
140 ex parser::operator()(const std::string& input)
142 std::istringstream is(input);
143 ex ret = operator()(is);
147 int parser::get_next_tok()
149 token = scanner->gettok();
153 parser::parser(const symtab& syms_, const prototype_table& funcs_,
154 const bool strict_) : strict(strict_), funcs(funcs_),
157 scanner = new lexer();