源代码:
#include <iostream> #include <cstdio> #include <cstring> #include <windows.h> #include <conio.h> using namespace std;//The namespace. int top = 0; int lines = 0; bool inDoubleQuote; bool inSingleQuote; bool isPreprocessor; bool isStringInPreprocessor; bool isSingleLineComment; bool isMoreLinesComment; /*The variables.*/ char word[101]; string str[1000001]; string reservedWords[56] = { "if", "else", "while", "signed", "throw", "union", "this", "int", "char", "double", "unsigned", "const", "goto", "virtual", "for", "float", "break", "auto", "class", "operator", "case", "do", "long", "typedef", "static", "friend", "template", "default", "new", "void", "register", "extern", "return", "enum", "inline", "try", "short", "continue", "sizeof", "switch", "private", "protected", "asm", "catch", "delete", "public", "volatile", "struct", "using", "namespace", "bool", "true", "false", "not", "and", "or" }; bool IsReservedWord(); bool IsNumber(); int main() { system("color F0"); freopen("main.cpp", "r", stdin); string s; while (getline(cin, s)) { str[lines] = s; lines++; } fclose(stdin); SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), (COORD){80, (short)(lines+1)}); isMoreLinesComment = false; for (int i=0; i<lines; i++) { CONSOLE_SCREEN_BUFFER_INFO consoleScreenBufferSize; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &consoleScreenBufferSize); if (consoleScreenBufferSize.dwSize.X < str[i].length()+4) { SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), (COORD){(short)(str[i].length()+5), consoleScreenBufferSize.dwSize.Y}); } SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED); printf("%3d ", i+1); isSingleLineComment = false; top = 0; inDoubleQuote = false; inSingleQuote = false; isPreprocessor = false; isStringInPreprocessor = false; memset(word, 0, sizeof(word)); for (int j=0; j<str[i].length(); j++) { if (not(isSingleLineComment or isMoreLinesComment)) { if (inDoubleQuote==false and inSingleQuote==false) { if (str[i][j]=='/' and j+1<str[i].length() and str[i][j+1]=='/') { isSingleLineComment = true; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY); cout << str[i][j]; continue; } else if (str[i][j]=='/' and j+1<str[i].length() and str[i][j+1]=='*') { isMoreLinesComment = true; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY); cout << str[i][j]; continue; } } if (inDoubleQuote == false and inSingleQuote == false and isPreprocessor == false) { if ((str[i][j]>='a' and str[i][j]<='z') or (str[i][j]>='A' and str[i][j]<='Z') or (str[i][j]>='0' and str[i][j]<='9')) { top++; word[top] = str[i][j]; } else { if (top > 0) { if (IsReservedWord()) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE|FOREGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY); } else if (IsNumber()) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY); } else { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY); } for (int k=0; k<top; k++) { cout << word[k]; } top = 0; } if (str[i][j] == '\"' and inSingleQuote == false) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY); cout << str[i][j]; inDoubleQuote = !inDoubleQuote; } else if (str[i][j] != '#') { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY); if (inDoubleQuote == false and str[i][j] == '\'') { inSingleQuote = !inSingleQuote; } cout << str[i][j]; } else { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE|FOREGROUND_INTENSITY|BACKGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED); cout << str[i][j]; isPreprocessor = true; } } } else if (isPreprocessor == false) { if (str[i][j] == '\"' and inDoubleQuote == true) { inDoubleQuote = !inDoubleQuote; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_INTENSITY|BACKGROUND_RED); } else if (str[i][j] == '\'' and inSingleQuote == true) { inSingleQuote = !inSingleQuote; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|BACKGROUND_INTENSITY); } cout << str[i][j]; } else { if (not isStringInPreprocessor) { if (str[i][j] == '<' or str[i][j] == '\"') { isStringInPreprocessor = true; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_INTENSITY|BACKGROUND_RED); } else { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE|FOREGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_INTENSITY|BACKGROUND_RED); } cout << str[i][j]; } else { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED|BACKGROUND_RED|BACKGROUND_INTENSITY|BACKGROUND_GREEN|BACKGROUND_BLUE); cout << str[i][j]; if (str[i][j] == '>' or str[i][j] == '\"') { isStringInPreprocessor = false; } } } } else { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_INTENSITY|BACKGROUND_RED); cout << str[i][j]; if (j>0 and str[i][j-1]=='*' and str[i][j]=='/') { isMoreLinesComment = false; } } } if (top > 0) { if (IsReservedWord()) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE|FOREGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY); } else if (IsNumber()) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY); } else { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_INTENSITY); } for (int k=0; k<top; k++) { cout << word[k]; } top = 0; } cout << endl; } getch(); return 0; } bool IsReservedWord() { for (int i=0; i<top; i++) { word[i] = word[i+1]; } word[top] = 0; for (int i=0; i<56; i++) { if (word == reservedWords[i]) { return true; } } return false; } bool IsNumber() { for (int i=0; i<top; i++) { if (not(word[i]>='0' and word[i]<='9')) { return false; } } return true; }
运行效果: