@ -82,11 +82,7 @@ bool IsTypeKWForTypeCast(ref Token pt)
{
{
if (Tokens.TypeKW[pt.kind]) {
if (Tokens.TypeKW[pt.kind]) {
pt = lexer.Peek();
pt = lexer.Peek();
if (pt.kind == Tokens.Times || pt.kind == Tokens.OpenSquareBracket) {
return IsPointerOrDims(ref pt) && SkipQuestionMark(ref pt);
return IsPointerOrDims(ref pt);
} else {
return true;
}
} else if (pt.kind == Tokens.Void) {
} else if (pt.kind == Tokens.Void) {
pt = lexer.Peek();
pt = lexer.Peek();
return IsPointerOrDims(ref pt);
return IsPointerOrDims(ref pt);
@ -103,7 +99,7 @@ bool IsTypeNameOrKWForTypeCast(ref Token pt)
return IsTypeNameForTypeCast(ref pt);
return IsTypeNameForTypeCast(ref pt);
}
}
// TypeName = ident [ "::" ident ] { "." ident } ["<" TypeNameOrKW { "," TypeNameOrKW } ">" ] PointerOrDims
// TypeName = ident [ "::" ident ] { ["<" TypeNameOrKW { "," TypeNameOrKW } ">" ] "." ident } ["?" ] PointerOrDims
/* !!! Proceeds from current peek position !!! */
/* !!! Proceeds from current peek position !!! */
bool IsTypeNameForTypeCast(ref Token pt)
bool IsTypeNameForTypeCast(ref Token pt)
{
{
@ -120,26 +116,29 @@ bool IsTypeNameForTypeCast(ref Token pt)
}
}
pt = Peek();
pt = Peek();
}
}
// { "." ident }
// { ["<" TypeNameOrKW { "," TypeNameOrKW } ">" ] "." ident }
while (pt.kind == Tokens.Dot) {
while (true) {
pt = Peek();
if (pt.kind == Tokens.LessThan) {
if (pt.kind != Tokens.Identifier) {
do {
return false;
pt = Peek();
}
if (!IsTypeNameOrKWForTypeCast(ref pt)) {
pt = Peek();
return false;
}
}
if (pt.kind == Tokens.LessThan) {
} while (pt.kind == Tokens.Comma);
do {
if (pt.kind != Tokens.GreaterThan) {
pt = Peek();
if (!IsTypeNameOrKWForTypeCast(ref pt)) {
return false;
return false;
}
}
} while (pt.kind == Tokens.Comma);
pt = Peek();
if (pt.kind != Tokens.GreaterThan) {
}
if (pt.kind != Tokens.Dot)
break;
pt = Peek();
if (pt.kind != Tokens.Identifier) {
return false;
return false;
}
}
pt = Peek();
pt = Peek();
}
}
// ["?"]
if (pt.kind == Tokens.Question) {
if (pt.kind == Tokens.Question) {
pt = Peek();
pt = Peek();
}
}
@ -328,21 +327,11 @@ bool IsPointer () { return la.kind == Tokens.Times; }
bool SkipGeneric(ref Token pt)
bool SkipGeneric(ref Token pt)
{
{
if (pt.kind == Tokens.LessThan) {
if (pt.kind == Tokens.LessThan) {
int braces = 1;
do {
while (braces != 0) {
pt = Peek();
pt = Peek();
if (pt.kind == Tokens.GreaterThan) {
if (!IsTypeNameOrKWForTypeCast(ref pt)) return false;
--braces;
} while (pt.kind == Tokens.Comma);
} else if (pt.kind == Tokens.LessThan) {
if (pt.kind != Tokens.GreaterThan) return false;
++braces;
} else if (pt.kind != Tokens.Identifier && pt.kind != Tokens.Comma
&& pt.kind != Tokens.OpenSquareBracket && pt.kind != Tokens.CloseSquareBracket
&& pt.kind != Tokens.Question
&& !Tokens.TypeKW[pt.kind])
{
return false;
}
}
pt = Peek();
pt = Peek();
}
}
return true;
return true;
@ -366,16 +355,8 @@ bool IsLocalVarDecl () {
}
}
StartPeek();
StartPeek();
Token pt = la ;
Token pt = la;
string ignore;
return IsTypeNameOrKWForTypeCast(ref pt) && pt.kind == Tokens.Identifier;
if (!IsQualident(ref pt, out ignore)) return false;
if (!SkipGeneric(ref pt)) return false;
while (pt.kind == Tokens.Dot) {
pt = Peek();
if (!IsQualident(ref pt, out ignore)) return false;
if (!SkipGeneric(ref pt)) return false;
}
return SkipQuestionMark(ref pt) && IsPointerOrDims(ref pt) && pt.kind == Tokens.Identifier;
}
}
/* True if lookahead is type parameters (<...>) followed by the specified token */
/* True if lookahead is type parameters (<...>) followed by the specified token */