public AsmContext Assemble(string content, string fileName = null) { var symbols = new AsmSymbols(); IList<Token> tokens = new List<Token>(); LoadRecursive(content, tokens, fileName); tokens = ProcessSymbolConstants(tokens, symbols); AsmContext last = null; for (var i = 1; i < 10; i++) { var context = new AsmContext { Queue = new TokensQueue(tokens), Symbols = symbols, Pass = i }; var parser = new AsmParser(context); AssemblePass(context, parser); if (TheSame(last, context)) break; last = context; } return last; }
private static void CopyLine(IList<Token> source, IList<Token> target, AsmSymbols symbols, ref int pointer) { while (pointer < source.Count) { var tkn = source[pointer++]; if (tkn.Type == TokenType.NewLine) { target.Add(tkn); break; } IList<Token> replaced; if (symbols.SymbolicConstants.TryGetValue(tkn.StringValue, out replaced)) { foreach (var repl in replaced) { if (repl.Type != TokenType.NewLine) { var item = repl; item.Position = tkn.Position; target.Add(item); } } } else { target.Add(tkn); } } }
protected IList<Token> ProcessSymbolConstants(IList<Token> tokens, AsmSymbols symbols) { var result = new List<Token>(); for (var i = 0; i < tokens.Count; ) { var nameToken = tokens[i++]; if (i < tokens.Count) { var equToken = tokens[i]; if (equToken.Type == TokenType.Literal && equToken.StringValue.ToLower() == "equ") { i++; var meaning = new List<Token>(); CopyLine(tokens, meaning, symbols, ref i); symbols.SymbolicConstants[nameToken.StringValue] = meaning; } else { i--; CopyLine(tokens, result, symbols, ref i); } } else { i--; CopyLine(tokens, result, symbols, ref i); } } return result; }