Beispiel #1
0
        public void Visit(VarList node)
        {
            foreach (var n in node)
            {
                //Visit((dynamic) n);
                var variableName = n.AnchorToken.Lexeme;

                if (currentFunc == "")
                {
                    if (visitCount > 0)
                    {
                        return;
                    }
                    if (GlobalSymbols.Contains(variableName))
                    {
                        throw new SemanticError(
                                  "Duplicated variable: " + variableName,
                                  n.AnchorToken);
                    }
                    else
                    {
                        GlobalSymbols[variableName] = 0;
                    }
                }
                else
                {
                    if (Functions.getLocalFT(currentFunc).Contains(variableName))
                    {
                        throw new SemanticError(
                                  "Duplicated variable: " + variableName,
                                  n.AnchorToken);
                    }
                    else
                    {
                        Functions.getLocalFT(currentFunc).addVar(variableName, "L", -1);
                    }
                }
            }

            return;
        }
Beispiel #2
0
        public virtual void DefineCommSymbol(string name, int size, int align)
        {
            if (Pass > 1)
            {
                return;
            }
            if (LocalSymTable.ContainsKey(name))
            {
                return;
            }
            if (size <= 0)
            {
                size = 1;
            }
            // round up alignment to a power of 2
            int al = 1;

            while (al < align)
            {
                al <<= 1;
            }
            align = al;
            SyEntry newsym;

            if (!GlobalSymbols.TryGetValue(name, out newsym))
            {
                newsym = new SyEntry(name, 0, size, align);
                GlobalSymbols[name] = newsym;
            }
            else if (newsym.Kind == SymbolKind.CommSymbol)
            {
                // combine new size and alignment with old values
                newsym.Size  = size;
                newsym.Align = align;
            }     // else ignore the .comm definition because it's
                  // already defined as a normal label
            LocalSymTable[name] = newsym;
        }
Beispiel #3
0
        public SyEntry LookupSymbol(string name, out bool isNewUnknown)
        {
            isNewUnknown = false;
            if (Char.IsDigit(name[0]))
            {
                return(LookupNumericLabel(name));
            }
            SyEntry sy = null;

            if (LocalSymTable.TryGetValue(name, out sy))
            {
                return(sy);
            }
            if (GlobalSymbols.TryGetValue(name, out sy))
            {
                return(sy);
            }
            if (!UndefLocals.Contains(name))
            {
                UndefLocals.Add(name);
                isNewUnknown = true;
            }
            return(null);
        }