コード例 #1
0
ファイル: SemanticAnalyzer.cs プロジェクト: aLagoG/chimera
        public SemanticAnalyzer()
        {
            symbolTable             = new SymbolTable();
            procedureTable          = new ProcedureTable();
            procedureTable["WrInt"] = new ProcedureTable.Row(Type.VOID, true);
            procedureTable["WrInt"].symbols["i"] = new SymbolTable.Row(Type.INT, Kind.PARAM, 0);

            procedureTable["WrStr"] = new ProcedureTable.Row(Type.VOID, true);
            procedureTable["WrStr"].symbols["s"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, 0);

            procedureTable["WrBool"] = new ProcedureTable.Row(Type.VOID, true);
            procedureTable["WrBool"].symbols["b"] = new SymbolTable.Row(Type.BOOL, Kind.PARAM, 0);

            procedureTable["WrLn"] = new ProcedureTable.Row(Type.VOID, true);

            procedureTable["RdInt"] = new ProcedureTable.Row(Type.INT, true);
            procedureTable["RdStr"] = new ProcedureTable.Row(Type.STRING, true);

            procedureTable["AtStr"] = new ProcedureTable.Row(Type.STRING, true);
            procedureTable["AtStr"].symbols["s"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, pos: 0);
            procedureTable["AtStr"].symbols["i"] = new SymbolTable.Row(Type.INT, Kind.PARAM, pos: 1);

            procedureTable["LenStr"] = new ProcedureTable.Row(Type.INT, true);
            procedureTable["LenStr"].symbols["s"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, pos: 0);

            procedureTable["CmpStr"] = new ProcedureTable.Row(Type.INT, true);
            procedureTable["CmpStr"].symbols["s1"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, pos: 0);
            procedureTable["CmpStr"].symbols["s2"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, pos: 1);

            procedureTable["CatStr"] = new ProcedureTable.Row(Type.STRING, true);
            procedureTable["CatStr"].symbols["s1"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, pos: 0);
            procedureTable["CatStr"].symbols["s2"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, pos: 1);

            procedureTable["LenLstInt"] = new ProcedureTable.Row(Type.INT, true);
            procedureTable["LenLstInt"].symbols["loi"] = new SymbolTable.Row(Type.INT_LIST, Kind.PARAM, pos: 0);

            procedureTable["LenLstStr"] = new ProcedureTable.Row(Type.INT, true);
            procedureTable["LenLstStr"].symbols["los"] = new SymbolTable.Row(Type.STRING_LIST, Kind.PARAM, pos: 0);

            procedureTable["LenLstBool"] = new ProcedureTable.Row(Type.INT, true);
            procedureTable["LenLstBool"].symbols["lob"] = new SymbolTable.Row(Type.BOOL_LIST, Kind.PARAM, pos: 0);

            procedureTable["NewLstInt"] = new ProcedureTable.Row(Type.INT_LIST, true);
            procedureTable["NewLstInt"].symbols["size"] = new SymbolTable.Row(Type.INT, Kind.PARAM, pos: 0);

            procedureTable["NewLstStr"] = new ProcedureTable.Row(Type.STRING_LIST, true);
            procedureTable["NewLstStr"].symbols["size"] = new SymbolTable.Row(Type.INT, Kind.PARAM, pos: 0);

            procedureTable["NewLstBool"] = new ProcedureTable.Row(Type.BOOL_LIST, true);
            procedureTable["NewLstBool"].symbols["size"] = new SymbolTable.Row(Type.INT, Kind.PARAM, pos: 0);

            procedureTable["IntToStr"] = new ProcedureTable.Row(Type.STRING, true);
            procedureTable["IntToStr"].symbols["i"] = new SymbolTable.Row(Type.INT, Kind.PARAM, pos: 0);

            procedureTable["StrToInt"] = new ProcedureTable.Row(Type.INT, true);
            procedureTable["StrToInt"].symbols["s"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, pos: 0);
        }
コード例 #2
0
ファイル: SemanticAnalyzer.cs プロジェクト: aLagoG/chimera
        public Type Visit(ProcedureDeclarationNode node)
        {
            var procedureName = node.AnchorToken.Lexeme;

            if (procedureTable.Contains(procedureName))
            {
                throw new SemanticError($"Duplicate procedure {procedureName}", node.AnchorToken);
            }
            Type procedureType = Visit((dynamic)node[1]);

            procedureTable[procedureName] = new ProcedureTable.Row(procedureType, false);
            currentScope = procedureName;

            Visit((dynamic)node[0]);
            VisitChildren(node, 2);

            currentScope = "";
            return(procedureType);
        }