Example #1
0
 public DefineMacro(string key, WordCollection wc, int argcount)
 {
     Keyword = key;
     Statement = wc;
     ArgCount = argcount;
     Statement.Pointer = 0;
     HasArguments = argcount != 0;
     if (Statement.Collection.Count == 1)
         IDWord = Statement.Current as IdentifierWord;
     IsNull = wc.Collection.Count == 0;
 }
Example #2
0
        private static WordCollection expandMacro(WordCollection wc)
        {
            //マクロ展開
            wc.Pointer = 0;
            int count = 0;

            while (!wc.EOL)
            {
                IdentifierWord word = wc.Current as IdentifierWord;
                if (word == null)
                {
                    wc.ShiftNext();
                    continue;
                }
                string      idStr = word.Code;
                DefineMacro macro = GlobalStatic.IdentifierDictionary.GetMacro(idStr);
                if (macro == null)
                {
                    wc.ShiftNext();
                    continue;
                }
                count++;
                if (count > MAX_EXPAND_MACRO)
                {
                    throw new CodeEE("マクロの展開数が1文あたりの上限" + MAX_EXPAND_MACRO.ToString() + "を超えました(自己参照・循環参照のおそれ)");
                }
                if (!macro.HasArguments)
                {
                    wc.Remove();
                    wc.InsertRange(macro.Statement);
                    continue;
                }
                //関数型マクロ
                wc = expandFunctionlikeMacro(macro, wc);
            }
            wc.Pointer = 0;
            return(wc);
        }