Ejemplo n.º 1
0
	ExprList ReadExprList( std::list< std::string > & tokens ) {
		if( tokens.empty( ) ) {
			return ExprList( );
		} else {
			if( tokens.front( ) == "}" ) {
				return ExprList( );
			} else {
				boost::shared_ptr< Expr > expr = ReadExpr( tokens );
				
				if( tokens.empty( ) ) {
					throw SyntaxError( "ReadExprList: unexpected end of token stream" );
					//return ExprList( expr );
				} else if( tokens.front( ) == ";" ) {
					Match( tokens, ";" );
					ExprList exprlist = ReadExprList( tokens );
					exprlist.push_front( expr );
					return exprlist;
				} else {
					throw SyntaxError( "ReadExprList: unexpected token " + tokens.front( ) );
				}
			}
		}
	}
Ejemplo n.º 2
0
void ActParams()
{
	/*
		ActParams -> '(' [ ExprList ] ')'
	*/

  if ( debugMode) printf( "In ActParams\n");
	accept( lparen, 143);
	if ( sym != rparen)
	{
		ExprList();
	}

	accept( rparen, 142);
  if ( debugMode) printf( "Out ActParams\n");
}
Ejemplo n.º 3
0
void selector()
{
	/*
		selector -> . ident 
                | '[' ExprList ']' 
                | ^ 
                | '(' qualident ')'
	*/

  if ( debugMode) printf( "In selector\n");

  switch( sym)
  {
  	case per:
  		nextsym();
  		accept( ident, 1);
  		break;
  	case lbrac:
  		nextsym();
  		ExprList();
  		accept( rbrac, 147);
  		break;
  	case carat:
  		nextsym();
  		break;
  	// case lparen:
  	// 	nextsym();
  	// 	qualident();
  	// 	accept( rparen, 142);
  		break;
  	default:
  		error( invalid_sym, 1);
  		break;
  }
  if ( debugMode) printf( "Out selector\n");
}
Ejemplo n.º 4
0
ExprImportCall Import::operator()() {
	return ExprImportCall(*this, ExprList());
}
Ejemplo n.º 5
0
// primaryExpr ::= NUMBER
//               | STRING
//               | variable
//               | function '(' exprList ')'
//               | '(' expr ')'
std::unique_ptr<Expr> FlowParser::primaryExpr()
{
	FNTRACE();

	static struct {
		const char* ident;
		long long nominator;
		long long denominator;
	} units[] = {
		{ "byte", 1, 1 },
		{ "kbyte", 1024llu, 1 },
		{ "mbyte", 1024llu * 1024, 1 },
		{ "gbyte", 1024llu * 1024 * 1024, 1 },
		{ "tbyte", 1024llu * 1024 * 1024 * 1024, 1 },
		{ "bit", 1, 8 },
		{ "kbit", 1024llu, 8 },
		{ "mbit", 1024llu * 1024, 8 },
		{ "gbit", 1024llu * 1024 * 1024, 8 },
		{ "tbit", 1024llu * 1024 * 1024 * 1024, 8 },
		{ "sec", 1, 1 },
		{ "min", 60llu, 1 },
		{ "hour", 60llu * 60, 1 },
		{ "day", 60llu * 60 * 24, 1 },
		{ "week", 60llu * 60 * 24 * 7, 1 },
		{ "month", 60llu * 60 * 24 * 30, 1 },
		{ "year", 60llu * 60 * 24 * 365, 1 },
		{ nullptr, 1, 1 }
	};

	FlowLocation loc(location());

	switch (token()) {
		case FlowToken::Ident: {
			std::string name = stringValue();
			nextToken();

			Symbol* symbol = scope()->lookup(name, Lookup::All);
			if (!symbol) {
                // XXX assume that given symbol is a auto forward-declared handler.
                Handler* href = (Handler*) globalScope()->appendSymbol(std::make_unique<Handler>(name, loc));
				return std::make_unique<HandlerRefExpr>(href, loc);
			}

			if (auto variable = dynamic_cast<Variable*>(symbol))
				return std::make_unique<VariableExpr>(variable, loc);

			if (auto handler = dynamic_cast<Handler*>(symbol))
				return std::make_unique<HandlerRefExpr>(handler, loc);

			if (symbol->type() == Symbol::BuiltinFunction) {
				if (token() != FlowToken::RndOpen)
					return std::make_unique<FunctionCallExpr>((BuiltinFunction*) symbol, ExprList()/*args*/, loc);

				nextToken();
                ExprList args;
				bool rv = listExpr(args);
				consume(FlowToken::RndClose);
				if (!rv) return nullptr;
				return std::make_unique<FunctionCallExpr>((BuiltinFunction*) symbol, std::move(args), loc);
			}

			reportError("Unsupported symbol type of '%s' in expression.", name.c_str());
			return nullptr;
		}
		case FlowToken::Boolean: {
			std::unique_ptr<BoolExpr> e = std::make_unique<BoolExpr>(booleanValue(), loc);
			nextToken();
			return std::move(e);
		}
		case FlowToken::RegExp: {
			std::unique_ptr<RegExpExpr> e = std::make_unique<RegExpExpr>(RegExp(stringValue()), loc);
			nextToken();
			return std::move(e);
		}
		case FlowToken::InterpolatedStringFragment:
			return interpolatedStr();
		case FlowToken::String:
		case FlowToken::RawString: {
			std::unique_ptr<StringExpr> e = std::make_unique<StringExpr>(stringValue(), loc);
			nextToken();
			return std::move(e);
		}
		case FlowToken::Number: { // NUMBER [UNIT]
			auto number = numberValue();
			nextToken();

			if (token() == FlowToken::Ident) {
				std::string sv(stringValue());
				for (size_t i = 0; units[i].ident; ++i) {
					if (sv == units[i].ident
						|| (sv[sv.size() - 1] == 's' && sv.substr(0, sv.size() - 1) == units[i].ident))
					{
						nextToken(); // UNIT
						number = number * units[i].nominator / units[i].denominator;
						loc.update(end());
						break;
					}
				}
			}
			return std::make_unique<NumberExpr>(number, loc);
		}
		case FlowToken::IP: {
			std::unique_ptr<IPAddressExpr> e = std::make_unique<IPAddressExpr>(lexer_->ipValue(), loc);
			nextToken();
			return std::move(e);
		}
		case FlowToken::Cidr: {
			std::unique_ptr<CidrExpr> e = std::make_unique<CidrExpr>(lexer_->cidr(), loc);
			nextToken();
			return std::move(e);
		}
		case FlowToken::StringType:
		case FlowToken::NumberType:
		case FlowToken::BoolType:
			return castExpr();
		case FlowToken::Begin: { // lambda-like inline function ref
			char name[64];
			static unsigned long i = 0;
            ++i;
			snprintf(name, sizeof(name), "__lambda_%lu", i);

			FlowLocation loc = location();
			auto st = std::make_unique<SymbolTable>(scope(), name);
			enter(st.get());
			std::unique_ptr<Stmt> body = compoundStmt();
			leave();

			if (!body)
				return nullptr;

			loc.update(body->location().end);

			Handler* handler = new Handler(name, std::move(st), std::move(body), loc);
			// TODO (memory leak): add handler to unit's global scope, i.e. via:
			//       - scope()->rootScope()->insert(handler);
			//       - unit_->scope()->insert(handler);
			//       to get free'd
			return std::make_unique<HandlerRefExpr>(handler, loc);
		}
		case FlowToken::RndOpen: {
			nextToken();
			std::unique_ptr<Expr> e = expr();
			consume(FlowToken::RndClose);
			e->setLocation(loc.update(end()));
			return e;
		}
		default:
			TRACE(1, "Expected primary expression. Got something... else.");
			reportUnexpectedToken();
			return nullptr;
	}
}
							IntLiteral(
								0
							)
						)
						ExprStmt(
							BinExpr(
								VarExpr(
									result
								)
								=
								BinExpr(
									CallExpr(
										sin
										ExprList(
											IntLiteral(
												30
											)
											EmptyExprList()
										)
									)
									+
									IntLiteral(
										4
									)
								)
							)
						)
						ExprStmt(
							BinExpr(
								VarExpr(
									result
								)