private void InitTableStack() { tstack.AddSymbol(new Symbols.INT("int", 0, 0)); tstack.AddSymbol(new Symbols.CHAR("char", 0, 0)); tstack.AddSymbol(new Symbols.DOUBLE("double", 0, 0)); tstack.AddSymbol(new Symbols.VOID("void", 0, 0)); Symbols.ExternFunc f = new Symbols.ExternFunc("printf"); Symbols.GlobalVar v = new Symbols.GlobalVar("printf", 0, 0); Symbols.ParamVar str = new Symbols.ParamVar(); v.SetType(f); str.SetType(new Symbols.POINTER(new Symbols.CHAR())); f.AddArgument(str); f.SetUnspecifiedArgs(); tstack.AddSymbol(v); f = new Symbols.ExternFunc("scanf"); v = new Symbols.GlobalVar("scanf", 0, 0); v.SetType(f); f.AddArgument(str); f.SetUnspecifiedArgs(); tstack.AddSymbol(v); f = new Symbols.ExternFunc("getchar"); v = new Symbols.GlobalVar("getchar", 0, 0); v.SetType(f); f.SetType(new Symbols.INT()); tstack.AddSymbol(v); }
private Pair<Symbols.Var, Pair<Symbols.RefType, Symbols.RefType>> ParseDirectDeclarator( bool parse_abstract = false, bool parse_parameter = false) { Symbols.Var variable = null; Pair<Symbols.RefType, Symbols.RefType> tpair = null; Symbols.RefType type = null; if (scan.Peek().type == Token.Type.IDENTIFICATOR && !parse_abstract) { if (parse_parameter) { variable = new Symbols.ParamVar(scan.Read()); } else if (tstack.IsGlobal()) { variable = new Symbols.GlobalVar(scan.Read()); } else { variable = new Symbols.LocalVar(scan.Read()); } } else if (scan.Peek().type == Token.Type.LPAREN) { scan.Read(); Pair<Symbols.Var, Pair<Symbols.RefType, Symbols.RefType>> res = ParseDeclarator(parse_abstract, parse_parameter); variable = res.first; if (res.last != null) { if (tpair == null) { tpair = new Pair<Symbols.RefType, Symbols.RefType>(res.last.first, res.last.last); } else { tpair.last.SetType(res.last.first); tpair.last = res.last.last; } } CheckToken(scan.Peek(), Token.Type.RPAREN, false); if (res.last == null && res.first == null) { throw new Syntax.Exception("требуется выражение", scan.GetPos(), scan.GetLine()); } scan.Read(); } bool ret = false; while (true) { if (scan.Peek().type == Token.Type.LBRACKET) { type = new Symbols.ARRAY(scan.Read()); ((Symbols.ARRAY)type).SetSize(ParseAssignmentExpression()); CheckToken(scan.Peek(), Token.Type.RBRACKET, true); } else if (scan.Peek().type == Token.Type.LPAREN) { type = new Symbols.Func("", scan.Peek().pos, scan.Peek().line); scan.Read(); tstack.NewTable(); ((Symbols.Func)type).SetArguments(ParseParameterList()); ((Symbols.Func)type).SetTable(tstack.PopTable()); CheckToken(scan.Peek(), Token.Type.RPAREN, true); } else { ret = true; } if (type != null ) { if (tpair != null) { tpair.last.SetType(type); tpair.last = type; } else { tpair = new Pair<Symbols.RefType, Symbols.RefType>(type, type); } } type = null; if (ret) { return new Pair<Symbols.Var, Pair<Symbols.RefType, Symbols.RefType>>(variable, tpair); } } }
private void InitTableStack() { tstack.AddSymbol(new Symbols.INT("int", 0, 0)); tstack.AddSymbol(new Symbols.CHAR("char", 0, 0)); tstack.AddSymbol(new Symbols.DOUBLE("double", 0, 0)); tstack.AddSymbol(new Symbols.VOID("void", 0, 0)); Symbols.ExternFunc f = new Symbols.ExternFunc("printf"); Symbols.GlobalVar v = new Symbols.GlobalVar("printf", 0, 0); Symbols.ParamVar str = new Symbols.ParamVar(); v.SetType(f); str.SetType(new Symbols.POINTER(new Symbols.CHAR())); f.AddArgument(str); f.SetUnspecifiedArgs(); tstack.AddSymbol(v); f = new Symbols.ExternFunc("scanf"); v = new Symbols.GlobalVar("scanf", 0, 0); v.SetType(f); f.AddArgument(str); f.SetUnspecifiedArgs(); tstack.AddSymbol(v); f = new Symbols.ExternFunc("getchar"); v = new Symbols.GlobalVar("getchar", 0, 0); v.SetType(f); f.SetType(new Symbols.INT()); tstack.AddSymbol(v); }
private Pair <Symbols.Var, Pair <Symbols.RefType, Symbols.RefType> > ParseDirectDeclarator( bool parse_abstract = false, bool parse_parameter = false) { Symbols.Var variable = null; Pair <Symbols.RefType, Symbols.RefType> tpair = null; Symbols.RefType type = null; if (scan.Peek().type == Token.Type.IDENTIFICATOR && !parse_abstract) { if (parse_parameter) { variable = new Symbols.ParamVar(scan.Read()); } else if (tstack.IsGlobal()) { variable = new Symbols.GlobalVar(scan.Read()); } else { variable = new Symbols.LocalVar(scan.Read()); } } else if (scan.Peek().type == Token.Type.LPAREN) { scan.Read(); Pair <Symbols.Var, Pair <Symbols.RefType, Symbols.RefType> > res = ParseDeclarator(parse_abstract, parse_parameter); variable = res.first; if (res.last != null) { if (tpair == null) { tpair = new Pair <Symbols.RefType, Symbols.RefType>(res.last.first, res.last.last); } else { tpair.last.SetType(res.last.first); tpair.last = res.last.last; } } CheckToken(scan.Peek(), Token.Type.RPAREN, false); if (res.last == null && res.first == null) { throw new Syntax.Exception("требуется выражение", scan.GetPos(), scan.GetLine()); } scan.Read(); } bool ret = false; while (true) { if (scan.Peek().type == Token.Type.LBRACKET) { type = new Symbols.ARRAY(scan.Read()); ((Symbols.ARRAY)type).SetSize(ParseAssignmentExpression()); CheckToken(scan.Peek(), Token.Type.RBRACKET, true); } else if (scan.Peek().type == Token.Type.LPAREN) { type = new Symbols.Func("", scan.Peek().pos, scan.Peek().line); scan.Read(); tstack.NewTable(); ((Symbols.Func)type).SetArguments(ParseParameterList()); ((Symbols.Func)type).SetTable(tstack.PopTable()); CheckToken(scan.Peek(), Token.Type.RPAREN, true); } else { ret = true; } if (type != null) { if (tpair != null) { tpair.last.SetType(type); tpair.last = type; } else { tpair = new Pair <Symbols.RefType, Symbols.RefType>(type, type); } } type = null; if (ret) { return(new Pair <Symbols.Var, Pair <Symbols.RefType, Symbols.RefType> >(variable, tpair)); } } }