public Token PreCompleteClass() { Token tok = this.Next(); while (!tok.IsEnd() && !tok.IsLeftBracket()) { tok = tok.Next(); } if (tok.IsEnd()) { Program.Log("Bad class definition?\n"); return(tok); } int depth = 1; while (depth > 0) { tok = tok.Next(); if (tok.IsEnd()) { Program.Log("Failure on class closure: " + this.Next().Value); return(tok); } if (tok.IsLeftBracket()) { depth++; } else if (tok.IsRightBracket()) { depth--; } } return(tok); }
public Token CompleteType(Type type) { Token tok = this; bool save = type != null; if (tok.IsConst()) { if (save) { type.IsConst = true; } tok = tok.Next(); } if (save) { type.Name = tok.Value; } tok = tok.Next(); if (tok.IsTemplateBegin()) { if (save) { type.IsTemplate = true; type.SubType = new Type(); } tok = tok.Next(); tok = tok.CompleteType(save ? type.SubType : null); if (!tok.IsTemplateEnd()) { Program.Log("Not closed template?"); } tok = tok.Next(); } //Console.WriteLine("endtok: " + tok.Value); while (tok.IsTypeSpec()) { //Console.WriteLine("mod: "+tok.Value); if (save) { type.ModName += tok.Value; } tok = tok.Next(); } return(tok); }
private void replaceWithArray(Token from, Token to) { Token arr = new Token(); arr.Type = Token.Typeenum.Identifier; arr.Value = "array"; Token left = new Token(); left.Type = Token.Typeenum.Symbol; left.Value = "<"; Token right = new Token(); right.Type = Token.Typeenum.TemplateClosure; right.Value = ">"; linkTokens(arr, left); linkTokens(from.RealPrev(), arr); linkTokens(left, from); linkTokens(right, to.RealNext()); if (right.Next().IsIdentifier() || right.Next().Type == Token.Typeenum.TemplateClosure) { right.Whitespaces = " "; } linkTokens(to, right); }
private void fixArguments(Token tok) { String funcname = tok.Prev().Prev().Value; List <String> nonbasic = new List <String>(); while (!tok.IsRightPar()) { Type type = new Type(); tok = tok.CompleteType(type); String ident = tok.IsIdentifier() ? tok.Value : "anonymous"; if (tok.IsIdentifier() && !type.IsBasic() && type.ModName == "") { nonbasic.Add(ident); } if (tok.IsIdentifier()) { tok = tok.Next(); } if (tok.IsEnd() || tok.IsRightPar()) { break; } tok = tok.Next(); if (tok.IsEnd()) { break; } } tok = tok.Next(); if (!tok.IsLeftBracket()) { return; } tok = tok.Next(); if (tok.IsEnd()) { return; } int level = tok.ScopeLevel; Token next; Token prev; while (nonbasic.Count > 0 && !tok.IsRightBracket() && !tok.IsEnd() && tok.ScopeLevel == level) { next = tok.Next(); prev = tok.Prev(); if (tok.IsIdentifier() && !next.IsEnd() && prev.IsSemi() && next.IsAssign() && nonbasic.Contains(tok.Value)) { nonbasic.Remove(tok.Value); } tok = tok.Next(); } if (nonbasic.Count > 0) { Program.LogNoLine(funcname + ": nonbasic value-args without assignment found: "); bool comma = false; foreach (String s in nonbasic) { if (comma) { Program.LogNoLine(", ", false); } else { comma = true; } Program.LogNoLine(s, false); } Program.Log(".", false); } }
private void fixAllArguments() { // find global scope identifiers Token tok; int scope_level = 0; for (tok = root.Next(); !tok.IsEnd(); tok = tok.Next()) { if (tok.IsLeftBracket()) { scope_level++; } tok.ScopeLevel = scope_level; if (tok.IsRightBracket()) { scope_level--; } } // fix & tok = root.Next(); String class_name = ""; while (!tok.IsEnd()) { if (tok.IsImport()) { while (!tok.IsEnd() && !tok.IsSemi()) { tok = tok.Next(); } if (!tok.IsEnd()) { tok = tok.Next(); } continue; } if (tok.IsGlobal()) { if (tok.IsClass()) { tok = tok.Next(); if (tok.IsEnd()) { continue; } class_name = tok.Value; while (!tok.IsEnd() && !tok.IsLeftBracket()) { tok = tok.Next(); } continue; } class_name = ""; if (!tok.IsIdentifier()) { tok = tok.Next(); continue; } //Type type = new Type(); tok = tok.CompleteType(null); if (tok.IsEnd()) { continue; } tok = tok.Next(); if (!tok.IsLeftPar()) { while (!tok.IsEnd() && !tok.IsSemi()) { tok = tok.Next(); } if (!tok.IsEnd()) { tok = tok.Next(); } continue; } tok = tok.Next(); if (tok.IsEnd()) { continue; } fixArguments(tok); } else { if (tok.Value == class_name && tok.IsIdentifier() && tok.ScopeLevel == 1 && tok.Next().IsLeftPar()) { fixArguments(tok.Next().Next()); } } tok = tok.Next(); } }
private void process() { // real tokens, cut out comments and such Token prev = root; Token tok = root.RealNext(); while (!tok.IsEnd()) { if (tok.IsQuote()) { tok = tok.RealCompleteText(); } else if (tok.IsCharDelimiter()) { tok = tok.RealCompleteChar(); } else if (tok.IsBlockCommentStart()) { tok = tok.RealCompleteBlockComment(); } else if (tok.IsLineCommentStart()) { tok = tok.RealCompleteLineComment(); } else if (tok.IsDirectiveStart()) { tok = tok.RealCompleteDirective(); } else { prev = tok; tok++; } } // add semicolons to class definitions tok = root; for (tok = root; !tok.IsEnd(); tok = tok.Next()) { if (tok.IsEnum() || tok.IsClass() || tok.IsInterface()) { tok = tok.PreCompleteClass(); if (tok.IsEnd()) { Token semi = new Token(); semi.Type = Token.Typeenum.Symbol; semi.Value = ";"; Token tail = tok.Prev(); tail.InsertAfter(semi); tail.Whitespaces = ""; tok = semi; } else if (tok.Next().IsEnd() || !tok.Next().IsSemi()) { Token semi = new Token(); semi.Type = Token.Typeenum.Symbol; semi.Value = ";"; semi.Whitespaces = tok.Whitespaces; tok.Whitespaces = ""; tok.InsertAfter(semi); tok = semi; } } } // expand arrays enumstate state = enumstate.Clear; tok = root; while (!tok.Next().IsEnd()) { tok = tok.Next(); } for (; !tok.IsBegin(); tok = tok.Prev()) { if (tok.IsLeftBracket()) { state = enumstate.FoundBracket; continue; } else if (tok.IsAssign()) { if (state == enumstate.FoundBracket) { state = enumstate.FoundAssign; } else { state = enumstate.Clear; } continue; } else if (tok.IsIdentifier()) { if (state == enumstate.FoundAssign) { state = enumstate.FoundIdentifier; } else { state = enumstate.Clear; } continue; } if (tok.IsArrayEnd()) { if (state == enumstate.FoundIdentifier) { // go back until identifier while (!tok.IsEnd() && !tok.IsIdentifier()) { tok = tok.Prev(); } if (tok.IsEnd()) { Program.Log("Assignment in beginning of the file?"); continue; } continue; } // make an array tok.RemoveSelf(); tok = tok.Prev(); tok.RemoveSelf(); tok = tok.Prev(); Token ident = tok; while (!ident.IsBegin() && !ident.IsIdentifier()) { ident = ident.Prev(); } if (ident.IsBegin()) { Program.Log("Array without a type, am I parsing something inlined?"); continue; } replaceWithArray(ident, tok); tok = tok.Next(); } state = enumstate.Clear; } tok = root; for (tok = root; !tok.IsEnd(); tok = tok.Next()) { if (tok.IsNot()) { tok.Value = "!"; tok.Whitespaces = ""; } } if (Program.Fixargs) { fixAllArguments(); } }
private void replaceWithArray(Token from, Token to) { Token arr = new Token(); arr.Type = Token.Typeenum.Identifier; arr.Value = "array"; Token left = new Token(); left.Type = Token.Typeenum.Symbol; left.Value = "<"; Token right = new Token(); right.Type = Token.Typeenum.TemplateClosure; right.Value = ">"; linkTokens(arr, left); linkTokens(from.RealPrev(), arr); linkTokens(left,from); linkTokens(right,to.RealNext()); if (right.Next().IsIdentifier() || right.Next().Type == Token.Typeenum.TemplateClosure) right.Whitespaces = " "; linkTokens(to, right); }
private void fixArguments(Token tok) { String funcname = tok.Prev().Prev().Value; List<String> nonbasic = new List<String>(); while (!tok.IsRightPar()) { Type type = new Type(); tok = tok.CompleteType(type); String ident = tok.IsIdentifier() ? tok.Value : "anonymous"; if (tok.IsIdentifier() && !type.IsBasic() && type.ModName=="") nonbasic.Add(ident); if (tok.IsIdentifier()) tok = tok.Next(); if (tok.IsEnd() || tok.IsRightPar()) break; tok = tok.Next(); if (tok.IsEnd()) break; } tok = tok.Next(); if (!tok.IsLeftBracket()) return; tok=tok.Next(); if (tok.IsEnd()) return; int level = tok.ScopeLevel; Token next; Token prev; while (nonbasic.Count>0 && !tok.IsRightBracket() && !tok.IsEnd() && tok.ScopeLevel == level) { next=tok.Next(); prev = tok.Prev(); if (tok.IsIdentifier() && !next.IsEnd() && prev.IsSemi() && next.IsAssign() && nonbasic.Contains(tok.Value)) { nonbasic.Remove(tok.Value); } tok = tok.Next(); } if (nonbasic.Count > 0) { Program.LogNoLine(funcname + ": nonbasic value-args without assignment found: "); bool comma = false; foreach (String s in nonbasic) { if (comma) Program.LogNoLine(", ",false); else comma = true; Program.LogNoLine(s,false); } Program.Log(".",false); } }