44 for(
auto& op :
compiler.UnaryOperators ) {
45 ALIB_ASSERT_ERROR( !unaryOperators.Contains(op),
"EXPR",
46 "Doubly defined unary operator symbol '{}'.", op )
48 unaryOperators.EmplaceUnique(op);
50 operatorChars[it]= true;
53 for(
auto& op :
compiler.AlphabeticUnaryOperatorAliases ) {
54 ALIB_ASSERT_ERROR( !unaryOperators.Contains(op.first),
"EXPR",
55 "Doubly defined unary operator symbol '{}'.", op.first )
57 unaryOperators.EmplaceUnique(op.first);
58 if( !isalpha( op.first.CharAtStart() ) )
59 for( auto it : op.first )
60 operatorChars[it]= true;
64 for(
auto& op :
compiler.BinaryOperators ) {
65 ALIB_ASSERT_ERROR( !binaryOperators.Contains(op.first),
"EXPR",
66 "Doubly defined binary operator symbol '{}'.", op.first )
67 if( op.first == A_CHAR(
"[]") ) {
68 syntaxTokens[u8'[
']= true;
69 syntaxTokens[u8']
']= true;
71 binaryOperators.EmplaceUnique(op.first);
72 for( auto it : op.first )
73 operatorChars[it]= true;
76 for( auto& op : compiler.AlphabeticBinaryOperatorAliases ) {
77 ALIB_ASSERT_ERROR( !binaryOperators.Contains(op.first), "EXPR",
78 "Doubly defined binary operator symbol '{}
'.", op.first )
80 ALIB_DBG( auto originalOp= )
81 compiler.BinaryOperators.Find( op.second );
82 ALIB_ASSERT_ERROR( originalOp != compiler.BinaryOperators.end(), "EXPR",
83 "Alias '{}
' defined for unknown operator '{}
'.",
86 binaryOperators.EmplaceUnique(op.first);
87 if( !isalpha( op.first.CharAtStart() ) )
88 for( auto it : op.first )
89 operatorChars[it]= true;
395 if( token == Tokens::BraceOpen ) {
399 if( token != Tokens::BraceClose ) {
400 Exception e( ALIB_CALLER_NULLED, Exceptions::SyntaxErrorExpectation, EXPRESSIONS.GetResource(
"EE1"));
401 e.Add ( ALIB_CALLER_NULLED, Exceptions::ExpressionInfo, expression, tokPosition );
405 replace( parseSubscript( top() ) );
412 String unOp= getUnaryOp();
413 if( unOp.IsNotNull() ) {
414 push( compileTimeAllocator().New<ASTUnaryOp>(unOp, parseSimple(), position ) );
415 replace( parseSubscript( top() ) );
420 if( token == Tokens::LitInteger ) { push(compileTimeAllocator().New<ASTLiteral>(tokInteger, position, tokLiteralHint ) ); NextToken(); replace( parseSubscript(top()) );
return pop(); }
421 if( token == Tokens::LitFloat ) { push(compileTimeAllocator().New<ASTLiteral>(tokFloat , position, tokLiteralHint ) ); NextToken(); replace( parseSubscript(top()) );
return pop(); }
422 if( token == Tokens::LitString ) { push(compileTimeAllocator().New<ASTLiteral>(
String(compileTimeAllocator, tokString), position )); NextToken(); replace( parseSubscript(top()) );
return pop(); }
425 if( token == Tokens::Identifier || token == Tokens::AlphaBinOp ) {
430 if( token == Tokens::BraceOpen ) {
431 ASTFunction* astFunction= compileTimeAllocator().New<ASTFunction>( name, position, compileTimeAllocator );
435 if( token == Tokens::BraceClose ) {
439 astFunction->Arguments.emplace_back( Start() );
441 if( token == Tokens::Comma )
444 if( token != Tokens::BraceClose ) {
451 replace( parseSubscript( astFunction ) );
456 replace( parseSubscript( push(compileTimeAllocator().New<ASTIdentifier>(
String(compileTimeAllocator, name), position ) ) ) );
461 if( token == Tokens::EOT ) {
467 if( token == Tokens::BraceClose ) {
473 if( token == Tokens::SubscriptOpen || token == Tokens::SubscriptClose ) {
479 if( token == Tokens::Comma ) {
485 ALIB_ERROR(
"EXPR",
"Internal error. This should never happen." )