20 for(
auto& op :
compiler.UnaryOperators ) {
21 ALIB_ASSERT_ERROR( !unaryOperators.Contains(op),
"EXPR",
22 "Doubly defined unary operator symbol '{}'.", op )
24 unaryOperators.EmplaceUnique(op);
26 operatorChars[it]= true;
29 for(
auto& op :
compiler.AlphabeticUnaryOperatorAliases ) {
30 ALIB_ASSERT_ERROR( !unaryOperators.Contains(op.first),
"EXPR",
31 "Doubly defined unary operator symbol '{}'.", op.first )
33 unaryOperators.EmplaceUnique(op.first);
34 if( !isalpha( op.first.CharAtStart() ) )
35 for( auto it : op.first )
36 operatorChars[it]= true;
40 for(
auto& op :
compiler.BinaryOperators ) {
41 ALIB_ASSERT_ERROR( !binaryOperators.Contains(op.first),
"EXPR",
42 "Doubly defined binary operator symbol '{}'.", op.first )
43 if( op.first == A_CHAR(
"[]") ) {
44 syntaxTokens[u8'[
']= true;
45 syntaxTokens[u8']
']= true;
47 binaryOperators.EmplaceUnique(op.first);
48 for( auto it : op.first )
49 operatorChars[it]= true;
52 for( auto& op : compiler.AlphabeticBinaryOperatorAliases ) {
53 ALIB_ASSERT_ERROR( !binaryOperators.Contains(op.first), "EXPR",
54 "Doubly defined binary operator symbol '{}
'.", op.first )
56 ALIB_DBG( auto originalOp= )
57 compiler.BinaryOperators.Find( op.second );
58 ALIB_ASSERT_ERROR( originalOp != compiler.BinaryOperators.end(), "EXPR",
59 "Alias '{}
' defined for unknown operator '{}
'.",
62 binaryOperators.EmplaceUnique(op.first);
63 if( !isalpha( op.first.CharAtStart() ) )
64 for( auto it : op.first )
65 operatorChars[it]= true;
371 if( token == Tokens::BraceOpen ) {
375 if( token != Tokens::BraceClose ) {
376 Exception e( ALIB_CALLER_NULLED, Exceptions::SyntaxErrorExpectation, EXPRESSIONS.GetResource(
"EE1"));
377 e.Add ( ALIB_CALLER_NULLED, Exceptions::ExpressionInfo, expression, tokPosition );
381 replace( parseSubscript( top() ) );
388 String unOp= getUnaryOp();
389 if( unOp.IsNotNull() ) {
390 push( compileTimeAllocator().New<ASTUnaryOp>(unOp, parseSimple(), position ) );
391 replace( parseSubscript( top() ) );
396 if( token == Tokens::LitInteger ) { push(compileTimeAllocator().New<ASTLiteral>(tokInteger, position, tokLiteralHint ) ); NextToken(); replace( parseSubscript(top()) );
return pop(); }
397 if( token == Tokens::LitFloat ) { push(compileTimeAllocator().New<ASTLiteral>(tokFloat , position, tokLiteralHint ) ); NextToken(); replace( parseSubscript(top()) );
return pop(); }
398 if( token == Tokens::LitString ) { push(compileTimeAllocator().New<ASTLiteral>(
String(compileTimeAllocator, tokString), position )); NextToken(); replace( parseSubscript(top()) );
return pop(); }
401 if( token == Tokens::Identifier || token == Tokens::AlphaBinOp ) {
406 if( token == Tokens::BraceOpen ) {
407 ASTFunction* astFunction= compileTimeAllocator().New<ASTFunction>( name, position, compileTimeAllocator );
411 if( token == Tokens::BraceClose ) {
415 astFunction->Arguments.emplace_back( Start() );
417 if( token == Tokens::Comma )
420 if( token != Tokens::BraceClose ) {
427 replace( parseSubscript( astFunction ) );
432 replace( parseSubscript( push(compileTimeAllocator().New<ASTIdentifier>(
String(compileTimeAllocator, name), position ) ) ) );
437 if( token == Tokens::EOT ) {
443 if( token == Tokens::BraceClose ) {
449 if( token == Tokens::SubscriptOpen || token == Tokens::SubscriptClose ) {
455 if( token == Tokens::Comma ) {
461 ALIB_ERROR(
"EXPR",
"Internal error. This should never happen." )