public LiteValue Visit(SyntaxCallFunctionExpressionNode Node, LiteEnv Env) { var FuncIndex = LiteValue.Nil; var FuncName = Node.GetFuncIdentNode(); if (FuncName.GetType() == SyntaxNodeType.CallFunctionExpression) { FuncIndex = Visit(FuncName as SyntaxCallFunctionExpressionNode, Env); } else if (FuncName.GetType() == SyntaxNodeType.DotClassExpression) { var DotNode = FuncName as SyntaxDotClassExpressionNode; FuncIndex = Visit(DotNode, Env); if ((DotNode.GetCallIdentNode() as SyntaxIdentifierNode).GetValue() == "New") { return(FuncIndex); } } else if (FuncName.GetType() == SyntaxNodeType.Identifier) { FuncIndex = Env.Get((FuncName as SyntaxIdentifierNode).GetValue()); } if (FuncIndex == LiteValue.Nil || FuncIndex.Type != LiteValueType.Function) { Logger.DError($"unknown function : {FuncName}"); return(LiteValue.Error); } var Func = FuncTable.GetFunc((int)FuncIndex.Numeric); if (Func == null) { Logger.DError($"=> unknown fn name : {FuncIndex.Numeric}"); return(LiteValue.Error); } return(CallFunc(Func, Node.GetArgumentListNode() as SyntaxArgumentListStatementNode, Env)); }
// factor ::= assignment | dot | call | primary { <'*' | '/' | '%' > primary } // call ::= args // dot ::= "." ident private SyntaxNode ParseFactorNode() { var Left = ParsePrimaryNode(); if (Left == null) { return(null); } while (!TokenStream_.IsEnd()) { var Tok = TokenStream_.Peek(); switch (Tok.Type) { case TokenType.Operator: switch (Tok.Code) { case "*": case "/": case "%": TokenStream_.Take(); var Right = ParsePrimaryNode(); if (Right == null) { return(null); } Left = new SyntaxBinaryExpressionNode(Tok, Left, Right); break; case "=": TokenStream_.Take(); var Val = ParseExprNode(); if (Val == null) { return(null); } Left = new SyntaxAssignmentExpressionNode(Tok, Left, Val); break; default: return(Left); } break; case TokenType.Delimiter: switch (Tok.Code) { case ".": TokenStream_.Take(); if (Left.GetType() != SyntaxNodeType.Identifier) { ExitCode_ = new ExitFailedCode(". must use for class ident"); return(null); } if (!TokenStream_.TakeExpect(TokenType.Identifier, out Token CallIdent)) { ExitCode_ = new ExitUnexpectedSymbolCode(CallIdent); return(null); } Left = new SyntaxDotClassExpressionNode(Left as SyntaxIdentifierNode, new SyntaxIdentifierNode(CallIdent)); break; case "(": var ArgsNode = ParseArgumentListNode(); if (ArgsNode == null) { return(null); } Left = new SyntaxCallFunctionExpressionNode(Left, ArgsNode); break; case "[": var IndexNode = ParseIndexNode(); if (IndexNode == null) { return(null); } Left = new SyntaxIndexElementsExpressionNode(Left, IndexNode); break; default: return(Left); } break; default: return(Left); } } return(Left); }