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; }
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; }
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); }