4 public enum TokenType2 : TokenType
10 property bool isSpecifier
14 return isQualifier || this == _char || this == _short || this == _int || this == _uint || this == _int64 || this == _long || this == _signed ||
15 this == _unsigned || this == _float || this == _double || this == _void ||
16 this == _valist || this == thisClass || this == typedObject || this == anyObject ||
17 this == _typedef || this == _struct || this == _class || this == _union || this == _enum ||
18 this == _typeof || this == subClass;
22 property bool isQualifier
26 return this == _extern || this == _static || this == _auto || this == _register || this == _const || this == _volatile;
30 property bool isUnaryOperator
34 return this == '&' || this == '*' || this == '+' || this == '-' || this == '~' || this == '!' || this == _delete || this == _incref;
38 property bool isAssignmentOperator
42 return this == '='|| this == mulAssign || this == divAssign || this == modAssign ||
43 this == addAssign || this == subAssign || this == leftAssign || this == rightAssign ||
44 this == andAssign || this == xorAssign || this == orAssign;
56 case _void: Print("void"); break;
57 case _char: Print("char"); break;
58 case _short: Print("short"); break;
59 case _int: Print("int"); break;
60 case _long: Print("long"); break;
61 case _int64: Print("int64"); break;
62 case _unsigned: Print("unsigned"); break;
63 case _signed: Print("signed"); break;
64 case _float: Print("float"); break;
65 case _double: Print("double"); break;
66 case _typedef: Print("typedef"); break;
67 case _extern: Print("extern"); break;
68 case _static: Print("static"); break;
69 case _auto: Print("auto"); break;
70 case _register: Print("register"); break;
71 case _uint: Print("uint"); break;
72 case _const: Print("const"); break;
73 case _volatile: Print("volatile"); break;
74 case _valist: Print("va_list"); break;
75 case thisClass: Print("thisclass"); break;
76 case typedObject: Print("typed_Object"); break;
77 case anyObject: Print("any_object"); break;
78 case _struct: Print("struct"); break;
79 case _union: Print("union"); break;
80 case _enum: Print("enum"); break;
81 case _class: Print("class"); break;
83 case _typeof: Print("typeof"); break;
84 case subClass: Print("subclass"); break;
86 case incOp: Print("++"); break;
87 case decOp: Print("--"); break;
88 case sizeOf: Print("sizeof "); break;
89 case leftOp: Print("<<"); break;
90 case rightOp: Print(">>"); break;
91 case leOp: Print("<="); break;
92 case geOp: Print(">="); break;
93 case eqOp: Print("=="); break;
94 case neOp: Print("!="); break;
95 case andOp: Print("&&"); break;
96 case orOp: Print("||"); break;
97 case mulAssign: Print("*="); break;
98 case divAssign: Print("/="); break;
99 case modAssign: Print("%="); break;
100 case addAssign: Print("+="); break;
101 case subAssign: Print("-="); break;
102 case leftAssign: Print("<<="); break;
103 case rightAssign: Print(">>="); break;
104 case andAssign: Print("&="); break;
105 case xorAssign: Print("^="); break;
106 case orAssign: Print("|="); break;
122 Token token, nextToken;
124 int ambiguous, stackPos;
125 Array<Token> tokenStack { minAllocSize = 256 };
129 if(!nextToken) peekToken();
140 if(stackPos < tokenStack.count)
142 nextToken = tokenStack[stackPos++];
144 if(!ambiguous && stackPos == tokenStack.count)
152 TokenType2 type = (TokenType2)LexEc();
155 nextToken = { _refCount = 1, type = type, text = CopyString(GetYYText()) };
159 tokenStack.Add(nextToken);
170 if(!ambiguous && nextToken && stackPos == tokenStack.count)
173 tokenStack.Add(nextToken);
177 return stackPos - (nextToken ? 1 : 0);
180 void clearAmbiguity()
182 if(!--ambiguous && stackPos > 0)
185 for(i = 0; i < stackPos; i++)
186 delete tokenStack[i];
187 if(tokenStack.size > stackPos)
188 memmove(tokenStack.array, tokenStack.array + stackPos, (tokenStack.size - stackPos) * sizeof(Token));
189 tokenStack.size -= stackPos;
194 void popAmbiguity(int i)
210 PrintLn((char)token.type);
212 PrintLn(token.type, " (", token.text, ")");
216 public void initParser(File f)