// 私有方法,对每一行进行分析 private void Analyse(String sourceTemp, StringBuilder resultString, int row) { int state = 0; sourceTemp = sourceTemp.Trim(); char[] charArray = sourceTemp.ToCharArray(); for (int index = 0; charArray.Length != 0; index++) { // 分析注释 while (isAnnotation && sourceTemp.Length != 0) { // 多行注释结尾 if (sourceTemp[0] == '*' && sourceTemp[1] == '/') { isAnnotation = false; // 过滤注释部分 sourceTemp = sourceTemp.Substring(2); charArray = sourceTemp.ToCharArray(); } else { // 逐个字符进行判断 sourceTemp = sourceTemp.Substring(1); } } // 在过滤注释之后,判断源代码长度 if (sourceTemp.Length == 0) { break; } // 根据状态进行判断 switch (state) { case 0: { index = 0; char ch = charArray[index]; // 过滤空格 while (ch == ' ') { sourceTemp = sourceTemp.Substring(1); charArray = sourceTemp.ToCharArray(); ch = charArray[index]; } if (ch == '/') { if (index + 1 == charArray.Length) { } else if (charArray[index + 1] == '/') { // 单行注释,直接结束 charArray = "".ToCharArray(); break; } else if (charArray[index + 1] == '*') { // 多行注释 this.isAnnotation = true; sourceTemp = sourceTemp.Substring(index + 2); charArray = sourceTemp.ToCharArray(); state = 0; index = 0; break; } } if (Char.IsLetter(ch) || ch == '_') { // 判断是否是字母或者_ state = 1; } else if (Char.IsDigit(ch)) { // 判断是否是数字 state = 2; } else if (Utils.Include(Lexer.operators, ch)) { // 操作符判断 state = 3; } else if (Utils.Include(Lexer.seperators, ch)) { String s = Utils.CharToString(charArray, index + 1); switch (ch) { case ',': tokenList.Add(new Token("Comma", ch + "", row, true)); break; case ';': tokenList.Add(new Token("Semicolon", ch + "", row, true)); break; case '(': tokenList.Add(new Token("LeftTransparentheses", ch + "", row, true)); break; case ')': tokenList.Add(new Token("RightTransparentheses", ch + "", row, true)); break; case '[': tokenList.Add(new Token("ArrayLeftDelimiter", ch + "", row, true)); break; case ']': tokenList.Add(new Token("ArrayRightDelimiter", ch + "", row, true)); break; case '{': tokenList.Add(new Token("LeftBrace", ch + "", row, true)); break; case '}': tokenList.Add(new Token("RightBrace", ch + "", row, true)); break; } resultString.Append(s + ":Separator\n"); sourceTemp = sourceTemp.Substring(index + 1); charArray = sourceTemp.ToCharArray(); state = 0; index = 0; } else { tokenList.Add(new Token("Unrecognized word symbol", ch + "", row, false)); resultString.Append(ch + ":Unrecognized word symbol.\n"); sourceTemp = sourceTemp.Substring(index + 1); charArray = sourceTemp.ToCharArray(); state = 0; index = 0; } break; } // 标识符的判断 case 1: { char ch = ' '; if (index < charArray.Length) { ch = charArray[index]; } // 字母、数字、下划线 if (Char.IsLetter(ch) || ch == '_' || Char.IsDigit(ch)) { state = 1; } else { String str = Utils.CharToString(charArray, index); if (Utils.Include(reservedwords, str)) { resultString.Append(str + ":Reserved words.\n"); switch (str) { case "int": case "real": tokenList.Add(new Token("VarialbeDeclarationWord", str, row, true)); break; case "read": tokenList.Add(new Token("Read", str, row, true)); break; case "write": tokenList.Add(new Token("Write", str, row, true)); break; case "if": tokenList.Add(new Token("If", str, row, true)); break; case "else": tokenList.Add(new Token("Else", str, row, true)); break; case "while": tokenList.Add(new Token("While", str, row, true)); break; } } else if (charArray[index - 1] == '_') { tokenList.Add(new Token("The identifier can not end with underline", str, row, false)); resultString.Append(str + ":The identifier can not end with underline\n"); } else { tokenList.Add(new Token("Identifier", str, row, true)); resultString.Append(str + ":Identifier\n"); } sourceTemp = sourceTemp.Substring(index); charArray = sourceTemp.ToCharArray(); state = 0; index = 0; } break; } // 数字的判断 case 2: { char ch = ' '; if (index < charArray.Length) { ch = charArray[index]; } if (Char.IsDigit(ch) || ch == '.') { state = 2; } else { String str = Utils.CharToString(charArray, index); try { double dou = Double.Parse(str); resultString.Append(str + ":Constant\n"); int i = (int)dou; if (dou == i) { tokenList.Add(new Token("Integer", str, row, true)); } else { tokenList.Add(new Token("Real", str, row, true)); } } catch (Exception e) { tokenList.Add(new Token("The number format is wrong", str, row, false)); resultString.Append(str + ":The number format is wrong\n"); } sourceTemp = sourceTemp.Substring(index); charArray = sourceTemp.ToCharArray(); state = 0; index = 0; } break; } // 操作符的判断 case 3: { char ch = ' '; if (index < charArray.Length) { ch = charArray[index]; } if (ch == '>' || ch == '=') { state = 3; } else { String str = Utils.CharToString(charArray, index); if (str.Equals("=")) { resultString.Append(str + ":Assignment operator\n"); tokenList.Add(new Token("Assignment", str, row, true)); } else if (str.Length == 1 && !str.Equals("<") && !str.Equals(">")) { resultString.Append(str + ":Arithmetic operator\n"); tokenList.Add(new Token("Arithmetic", str, row, true)); } else if (Utils.Include(Lexer.compare, str)) { resultString.Append(str + ":Comparison operator\n"); tokenList.Add(new Token("Comparison", str, row, true)); } else { tokenList.Add(new Token("Invalid operator", str, row, false)); resultString.Append(str + ":Invalid operator\n"); } sourceTemp = sourceTemp.Substring(index); charArray = sourceTemp.ToCharArray(); state = 0; index = 0; } break; } } } }