// // Created by Russell Joyce on 12/05/2020. // #include "stats.h" const char *RunModeNames[NO_RUN_MODES] = { "RunModeRun", "RunModeSkip", "RunModeReturn", "RunModeCaseSearch", "RunModeBreak", "RunModeContinue", "RunModeGoto" }; struct LexTokenStat LexTokenStats[NO_TOKENS] = { {"TokenNone", {0, 0, 0, 0, 0, 0, 0}}, {"TokenComma", {0, 0, 0, 0, 0, 0, 0}}, {"TokenAssign", {0, 0, 0, 0, 0, 0, 0}}, {"TokenAddAssign", {0, 0, 0, 0, 0, 0, 0}}, {"TokenSubtractAssign", {0, 0, 0, 0, 0, 0, 0}}, {"TokenMultiplyAssign", {0, 0, 0, 0, 0, 0, 0}}, {"TokenDivideAssign", {0, 0, 0, 0, 0, 0, 0}}, {"TokenModulusAssign", {0, 0, 0, 0, 0, 0, 0}}, {"TokenShiftLeftAssign", {0, 0, 0, 0, 0, 0, 0}}, {"TokenShiftRightAssign", {0, 0, 0, 0, 0, 0, 0}}, {"TokenArithmeticAndAssign", {0, 0, 0, 0, 0, 0, 0}}, {"TokenArithmeticOrAssign", {0, 0, 0, 0, 0, 0, 0}}, {"TokenArithmeticExorAssign", {0, 0, 0, 0, 0, 0, 0}}, {"TokenQuestionMark", {0, 0, 0, 0, 0, 0, 0}}, {"TokenColon", {0, 0, 0, 0, 0, 0, 0}}, {"TokenLogicalOr", {0, 0, 0, 0, 0, 0, 0}}, {"TokenLogicalAnd", {0, 0, 0, 0, 0, 0, 0}}, {"TokenArithmeticOr", {0, 0, 0, 0, 0, 0, 0}}, {"TokenArithmeticExor", {0, 0, 0, 0, 0, 0, 0}}, {"TokenAmpersand", {0, 0, 0, 0, 0, 0, 0}}, {"TokenEqual", {0, 0, 0, 0, 0, 0, 0}}, {"TokenNotEqual", {0, 0, 0, 0, 0, 0, 0}}, {"TokenLessThan", {0, 0, 0, 0, 0, 0, 0}}, {"TokenGreaterThan", {0, 0, 0, 0, 0, 0, 0}}, {"TokenLessEqual", {0, 0, 0, 0, 0, 0, 0}}, {"TokenGreaterEqual", {0, 0, 0, 0, 0, 0, 0}}, {"TokenShiftLeft", {0, 0, 0, 0, 0, 0, 0}}, {"TokenShiftRight", {0, 0, 0, 0, 0, 0, 0}}, {"TokenPlus", {0, 0, 0, 0, 0, 0, 0}}, {"TokenMinus", {0, 0, 0, 0, 0, 0, 0}}, {"TokenAsterisk", {0, 0, 0, 0, 0, 0, 0}}, {"TokenSlash", {0, 0, 0, 0, 0, 0, 0}}, {"TokenModulus", {0, 0, 0, 0, 0, 0, 0}}, {"TokenIncrement", {0, 0, 0, 0, 0, 0, 0}}, {"TokenDecrement", {0, 0, 0, 0, 0, 0, 0}}, {"TokenUnaryNot", {0, 0, 0, 0, 0, 0, 0}}, {"TokenUnaryExor", {0, 0, 0, 0, 0, 0, 0}}, {"TokenSizeof", {0, 0, 0, 0, 0, 0, 0}}, {"TokenCast", {0, 0, 0, 0, 0, 0, 0}}, {"TokenLeftSquareBracket", {0, 0, 0, 0, 0, 0, 0}}, {"TokenRightSquareBracket", {0, 0, 0, 0, 0, 0, 0}}, {"TokenDot", {0, 0, 0, 0, 0, 0, 0}}, {"TokenArrow", {0, 0, 0, 0, 0, 0, 0}}, {"TokenOpenBracket", {0, 0, 0, 0, 0, 0, 0}}, {"TokenCloseBracket", {0, 0, 0, 0, 0, 0, 0}}, {"TokenIdentifier", {0, 0, 0, 0, 0, 0, 0}}, {"TokenIntegerConstant", {0, 0, 0, 0, 0, 0, 0}}, {"TokenFPConstant", {0, 0, 0, 0, 0, 0, 0}}, {"TokenStringConstant", {0, 0, 0, 0, 0, 0, 0}}, {"TokenCharacterConstant", {0, 0, 0, 0, 0, 0, 0}}, {"TokenSemicolon", {0, 0, 0, 0, 0, 0, 0}}, {"TokenEllipsis", {0, 0, 0, 0, 0, 0, 0}}, {"TokenLeftBrace", {0, 0, 0, 0, 0, 0, 0}}, {"TokenRightBrace", {0, 0, 0, 0, 0, 0, 0}}, {"TokenIntType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenCharType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenFloatType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenDoubleType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenVoidType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenEnumType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenLongType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenSignedType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenShortType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenStaticType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenAutoType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenRegisterType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenExternType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenStructType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenUnionType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenUnsignedType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenTypedef", {0, 0, 0, 0, 0, 0, 0}}, {"TokenContinue", {0, 0, 0, 0, 0, 0, 0}}, {"TokenDo", {0, 0, 0, 0, 0, 0, 0}}, {"TokenElse", {0, 0, 0, 0, 0, 0, 0}}, {"TokenFor", {0, 0, 0, 0, 0, 0, 0}}, {"TokenGoto", {0, 0, 0, 0, 0, 0, 0}}, {"TokenIf", {0, 0, 0, 0, 0, 0, 0}}, {"TokenWhile", {0, 0, 0, 0, 0, 0, 0}}, {"TokenBreak", {0, 0, 0, 0, 0, 0, 0}}, {"TokenSwitch", {0, 0, 0, 0, 0, 0, 0}}, {"TokenCase", {0, 0, 0, 0, 0, 0, 0}}, {"TokenDefault", {0, 0, 0, 0, 0, 0, 0}}, {"TokenReturn", {0, 0, 0, 0, 0, 0, 0}}, {"TokenHashDefine", {0, 0, 0, 0, 0, 0, 0}}, {"TokenHashInclude", {0, 0, 0, 0, 0, 0, 0}}, {"TokenHashIf", {0, 0, 0, 0, 0, 0, 0}}, {"TokenHashIfdef", {0, 0, 0, 0, 0, 0, 0}}, {"TokenHashIfndef", {0, 0, 0, 0, 0, 0, 0}}, {"TokenHashElse", {0, 0, 0, 0, 0, 0, 0}}, {"TokenHashEndif", {0, 0, 0, 0, 0, 0, 0}}, {"TokenNew", {0, 0, 0, 0, 0, 0, 0}}, {"TokenDelete", {0, 0, 0, 0, 0, 0, 0}}, {"TokenOpenMacroBracket", {0, 0, 0, 0, 0, 0, 0}}, {"TokenEOF", {0, 0, 0, 0, 0, 0, 0}}, {"TokenEndOfLine", {0, 0, 0, 0, 0, 0, 0}}, {"TokenEndOfFunction", {0, 0, 0, 0, 0, 0, 0}}, {"TokenBackSlash", {0, 0, 0, 0, 0, 0, 0}}, {"TokenVolatileType", {0, 0, 0, 0, 0, 0, 0}}, {"TokenHashPragma", {0, 0, 0, 0, 0, 0, 0}}, {"TokenUnderscorePragma", {0, 0, 0, 0, 0, 0, 0}}, {"TokenConstType", {0, 0, 0, 0, 0, 0, 0}} }; void stats_log_statement(enum LexToken token, struct ParseState *parser) { if (parser->pc->CollectStats) { fprintf(stderr, "Parsing Statement %s (%d) in %s (%d) at %s:%d:%d\n", LexTokenStats[token].name, token, RunModeNames[parser->Mode], parser->Mode, parser->FileName, parser->Line, parser->CharacterPos); LexTokenStats[token].count[parser->Mode]++; } } void stats_log_expression(enum LexToken token, struct ParseState *parser) { if (parser->pc->CollectStats) { fprintf(stderr, "Parsing Expression %s (%d) in %s (%d) at %s:%d:%d\n", LexTokenStats[token].name, token, RunModeNames[parser->Mode], parser->Mode, parser->FileName, parser->Line, parser->CharacterPos); LexTokenStats[token].count[parser->Mode]++; } } void stats_print_tokens(int all) { fprintf(stderr, "\n*********\nToken stats:\n"); for (int i = 0; i < NO_RUN_MODES; i++) { fprintf(stderr, "***\n"); fprintf(stderr, "%s\n", RunModeNames[i]); for (int j = 0; j < NO_TOKENS; j++) { if (all || LexTokenStats[j].count[i] > 0) { fprintf(stderr, "%5d %s\n", LexTokenStats[j].count[i], LexTokenStats[j].name); } } } fprintf(stderr, "*********\n"); }