Called by yylex to get the next token. Returning 0 implies end of input.
| 830 | // Called by yylex to get the next token. |
| 831 | // Returning 0 implies end of input. |
| 832 | int TScanContext::tokenize(TPpContext* pp, TParserToken& token) |
| 833 | { |
| 834 | do { |
| 835 | parserToken = &token; |
| 836 | TPpToken ppToken; |
| 837 | int token = pp->tokenize(ppToken); |
| 838 | if (token == EndOfInput) |
| 839 | return 0; |
| 840 | |
| 841 | tokenText = ppToken.name; |
| 842 | loc = ppToken.loc; |
| 843 | parserToken->sType.lex.loc = loc; |
| 844 | switch (token) { |
| 845 | case ';': afterType = false; afterBuffer = false; inDeclaratorList = false; afterDeclarator = false; angleBracketDepth = 0; squareBracketDepth = 0; parenDepth = 0; return SEMICOLON; |
| 846 | case ',': |
| 847 | // If we just processed a declarator (identifier after a type), this comma |
| 848 | // indicates that we're in a declarator list. Note that 'afterDeclarator' is |
| 849 | // only set when we are not inside a template parameter list, array expression, |
| 850 | // or function parameter list. |
| 851 | if (afterDeclarator) { |
| 852 | inDeclaratorList = true; |
| 853 | } |
| 854 | afterType = false; |
| 855 | afterDeclarator = false; |
| 856 | return COMMA; |
| 857 | case ':': return COLON; |
| 858 | case '=': afterType = false; inDeclaratorList = false; afterDeclarator = false; return EQUAL; |
| 859 | case '(': afterType = false; inDeclaratorList = false; afterDeclarator = false; parenDepth++; return LEFT_PAREN; |
| 860 | case ')': afterType = false; inDeclaratorList = false; afterDeclarator = false; if (parenDepth > 0) parenDepth--; return RIGHT_PAREN; |
| 861 | case '.': field = true; return DOT; |
| 862 | case '!': return BANG; |
| 863 | case '-': return DASH; |
| 864 | case '~': return TILDE; |
| 865 | case '+': return PLUS; |
| 866 | case '*': return STAR; |
| 867 | case '/': return SLASH; |
| 868 | case '%': return PERCENT; |
| 869 | case '<': angleBracketDepth++; return LEFT_ANGLE; |
| 870 | case '>': if (angleBracketDepth > 0) angleBracketDepth--; return RIGHT_ANGLE; |
| 871 | case '|': return VERTICAL_BAR; |
| 872 | case '^': return CARET; |
| 873 | case '&': return AMPERSAND; |
| 874 | case '?': return QUESTION; |
| 875 | case '[': squareBracketDepth++; return LEFT_BRACKET; |
| 876 | case ']': if (squareBracketDepth > 0) squareBracketDepth--; return RIGHT_BRACKET; |
| 877 | case '{': afterStruct = false; afterBuffer = false; inDeclaratorList = false; afterDeclarator = false; angleBracketDepth = 0; squareBracketDepth = 0; parenDepth = 0; return LEFT_BRACE; |
| 878 | case '}': inDeclaratorList = false; afterDeclarator = false; angleBracketDepth = 0; squareBracketDepth = 0; parenDepth = 0; return RIGHT_BRACE; |
| 879 | case '\\': |
| 880 | parseContext.error(loc, "illegal use of escape character", "\\", ""); |
| 881 | break; |
| 882 | |
| 883 | case PPAtomAddAssign: return ADD_ASSIGN; |
| 884 | case PPAtomSubAssign: return SUB_ASSIGN; |
| 885 | case PPAtomMulAssign: return MUL_ASSIGN; |
| 886 | case PPAtomDivAssign: return DIV_ASSIGN; |
| 887 | case PPAtomModAssign: return MOD_ASSIGN; |
| 888 | |
| 889 | case PpAtomRight: return RIGHT_OP; |
no test coverage detected