Example #1
0
        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;
        }
Example #2
0
 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);
         }
     }
 }
Example #3
0
        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;
        }