/** * 토큰열을 분석하여 For 문 구문 요소를 추출한다. * * @param tokens * @param lineNumber * @return */ public static ForSyntax analyze(List <Token> tokens, int lineNumber) { if (tokens.Count < 7) { Debug.reportError("Syntax error", "For syntax is not valid", lineNumber); return(null); } // 괄호로 시작하는지 확인한다 if (tokens[1].type != Type.ShellOpen) { Debug.reportError("Syntax error", "For condition must start with \"(\"", lineNumber); return(null); } // 괄호로 끝나는지 확인한다. if (tokens[tokens.Count - 1].type != Type.ShellClose) { Debug.reportError("Syntax error", "insert \")\" to complete Expression", lineNumber); return(null); } if (tokens[2].type != Type.ID) { Debug.reportError("Syntax error", "Counter variable is not valid", lineNumber); return(null); } if (tokens[3].type != Type.In) { Debug.reportError("Syntax error", "Could not find token 'in'", lineNumber); return(null); } // 증감 범위를 자른다. List <Token> range = tokens.GetRange(4, tokens.Count - 1 - 4); // 범위지정 토큰의 위치를 찾는다. int indexOfRange = TokenTools.indexOf(range, Type.From); if (indexOfRange < 0) { Debug.reportError("Syntax error", "Could not find token '...'", lineNumber); return(null); } // 범위지정 토큰을 기준으로 분할한다. List <Token> start = range.GetRange(0, indexOfRange); List <Token> end = range.GetRange(indexOfRange + 1, range.Count - (indexOfRange + 1)); return(new ForSyntax(tokens[2], start, end)); }