//--------------------- // Парсер скобки [ //--------------------- private static ASTNode ParseBrackets(bool isCanValues) { ASTNode brackets = null; if (isCanValues) { GetNextToken(); if (curTok.token == Tokens.Token.BRACKET_R) { ConsoleHelper.WriteErrorAST("Expected '[X]'", curTok.y, curTok.x); } ASTNode exp = MemberBinOperation(); if (curTok.token == Tokens.Token.BRACKET_L) { exp = new BracketsAST(exp, ParseBrackets(true)); } brackets = exp; if (curTok.token == Tokens.Token.OP) { brackets = ParseBinaryOperation(exp); } else if (curTok.token != Tokens.Token.BRACKET_R) { ConsoleHelper.WriteErrorAST("Expected ']'", curTok.y, curTok.x); } } else { GetNextToken(); if (curTok.token != Tokens.Token.BRACKET_R) { ConsoleHelper.WriteErrorAST("Expected ']'", curTok.y, curTok.x); } brackets = new BracketsAST(); } GetNextToken(); return(brackets); }
//--------------------- // Парсер id //--------------------- private static ASTNode ParseId(string type, bool isArray) { bool isCall = type == ""; string idName = curTok.subString; string typeId = type == "" ? GetTypeID(idName) : type; ASTNode id = new IdentificatorAST(typeId, idName, new Point(curTok.y, curTok.x), isArray); GetNextToken(); Point point = new Point(curTok.y, curTok.x); // массив if (curTok.token == Tokens.Token.BRACKET_L) { ASTNode memberBrackets = ParseBrackets(true); isArray = true; BracketsAST brackets = new BracketsAST(memberBrackets); if (curTok.token == Tokens.Token.ASSIGNMENT) { return(new IdentificatorAST(typeId, idName, ParseInitID(), brackets, point, true)); } } if (curTok.token == Tokens.Token.CREMENT) { return(ParseCrement(id)); } if (curTok.token == Tokens.Token.PARENTHESIS_L) { return(ParseMethod("", idName, isCall)); } else if (curTok.token == Tokens.Token.ASSIGNMENT) { return(new IdentificatorAST(typeId, idName, ParseInitID(), point, isArray)); } return(id); }