Example #1
0
        private void AnalyzeNextElement(ElementNode element, CustomDefinition enviroument, bool isStatic = false)
        {
            switch (element.NodeType)
            {
            case NodeType.Variable:
                DefineVariableNode variable = null;
                if (enviroument is ClassDefinition classDefinition)
                {
                    variable = classDefinition.GetField(element.Content);
                }
                if (enviroument is StructDefinition structDefinition)
                {
                    variable = structDefinition.GetField(element.Content);
                }
                if (enviroument is InterfaceDefinition)
                {
                    return;                                         //TODO:报错 接口不存在字段
                }
                if (variable == null)
                {
                    return;                       //TODO:报错 类型 "" 中不存在 "" 的定义
                }
                if (isStatic && !variable.IsStatic)
                {
                    return;     //TODO:报错 对象引用对于非静态的字段、方法或属性 "" 是必须的
                }
                element.Definition = variable;
                element.Type       = element.Definition.Type;
                if (element.NextElement != null)
                {
                    AnalyzeNextElement(element.NextElement, element.Type);
                }
                break;

            case NodeType.Invoker:
                InvokerNode invoker = (InvokerNode)element;
                foreach (ExpressionNode expressionNode in invoker.Parms)
                {
                    AnalyzeExpression(expressionNode);
                }
                if (!enviroument.Contain(invoker.NameWithParms))
                {
                    return;                                                  //TODO:报错 当前上文中不存在函数 ""
                }
                FunctionDefinition function = enviroument.GetFunctionDefinition(invoker.NameWithParms);
                if (isStatic && !function.IsStatic)
                {
                    return;                                     //TODO:报错 对象引用对于非静态的字段、方法或属性 "" 是必须的
                }
                invoker.Function = function;
                invoker.Type     = function.ReturnType;
                if (invoker.NextElement != null)
                {
                    AnalyzeNextElement(invoker.NextElement, element.Type);
                }
                break;

            case NodeType.Array:
                if (!Symbols.Contain(element.Content))
                {
                    return;                                        //TODO:报错 当前上文中不存在标识符 ""
                }
                DefineVariableNode variableNode = null;
                if (enviroument is ClassDefinition classDefinition1)
                {
                    variableNode = classDefinition1.GetField(element.Content);
                }
                if (enviroument is StructDefinition structDefinition1)
                {
                    variableNode = structDefinition1.GetField(element.Content);
                }
                if (enviroument is InterfaceDefinition)
                {
                    return;                                         //TODO:报错 接口不存在字段
                }
                if (variableNode == null)
                {
                    return;                           //TODO:报错 类型 "" 中不存在 "" 的定义
                }
                if (isStatic && !variableNode.IsStatic)
                {
                    return;     //TODO:报错 对象引用对于非静态的字段、方法或属性 "" 是必须的
                }
                element.Definition = Symbols[element.Content];
                element.Type       = element.Definition.Type;
                if (element.NextElement != null)
                {
                    AnalyzeNextElement(element.NextElement, element.Type);
                }
                break;
            }
        }
Example #2
0
        private void AnalyzeElement(ElementNode element) //写的不好
        {
            switch (element.NodeType)
            {
            case NodeType.Unknown:
                return;     //TODO:报错 未知错误

            case NodeType.Expression:
                AnalyzeExpression(element.Expression);
                element.Type = element.Expression.Type;
                break;

            case NodeType.NumericLiteral:
                element.Type = Symbols.GetDefinition("int");
                break;

            case NodeType.FloatLiteral:
                element.Type = Symbols.GetDefinition("float");
                break;

            case NodeType.StringLiteral:
                element.Type = Symbols.GetDefinition("string");
                break;

            case NodeType.CharacterLiteral:
                element.Type = Symbols.GetDefinition("char");
                break;

            case NodeType.BooleanLiteral:
                element.Type = Symbols.GetDefinition("bool");
                break;

            case NodeType.New:
                NewNode newNode = (NewNode)element;
                foreach (ExpressionNode expressionNode in newNode.Parms)
                {
                    AnalyzeExpression(expressionNode);
                }
                newNode.Type = Symbols.GetDefinition(newNode.TypeName);
                if (newNode.Type == null)
                {
                    return;                           //TODO:报错 未能找到类型或命名空间名称 ""(是否缺少 using 指令或程序集引用?)
                }
                if (newNode.Type is InterfaceDefinition)
                {
                    return;                                          //TODO:报错 无法创建接口 "" 的实例
                }
                if (!newNode.Type.Contain(newNode.NameWithParms))
                {
                    return;                                                   //TODO:报错 当前上文中不存在函数 ""
                }
                newNode.Constructor = newNode.Type.GetFunctionDefinition(newNode.NameWithParms);
                if (newNode.NextElement != null)
                {
                    AnalyzeNextElement(newNode.NextElement, element.Type);
                }
                newNode.Type = newNode.LastElement.Type;     //由头一个标识符表示整串标识符的类型
                break;

            case NodeType.Variable:
                if (Symbols.Contain(element.Content))     //处理标识符表示对象的情况
                {
                    DefineVariableNode variable = Symbols[element.Content];
                    if (_analyzingFunction.IsStatic && !variable.IsStatic)
                    {
                        return;     //TODO:报错 对象引用对于非静态的字段、方法或属性 "" 是必须的
                    }
                    element.Definition = variable;
                    element.Type       = element.Definition.Type;
                    if (element.NextElement != null)
                    {
                        AnalyzeNextElement(element.NextElement, element.Type);
                    }
                    element.Type = element.LastElement.Type;     //由头一个标识符表示整串标识符的类型
                    break;
                }
                //处理标识符表示类型名字的情况
                CustomDefinition definition = Symbols.GetDefinition(element.Content);
                if (definition == null)
                {
                    return;                         //TODO:报错 未能找到类型或命名空间名称 ""(是否缺少 using 指令或程序集引用?)
                }
                element.NodeType = NodeType.CustomType;
                element.Type     = definition;
                if (element.NextElement == null)
                {
                    return;                                  //TODO:报错 "" 是个类型,在给定的上下文中无效
                }
                AnalyzeNextElement(element.NextElement, element.Type, true);
                element.Type = element.LastElement.Type;     //由头一个标识符表示整串标识符的类型
                break;

            case NodeType.Invoker:
                InvokerNode invoker = (InvokerNode)element;
                foreach (ExpressionNode expressionNode in invoker.Parms)
                {
                    AnalyzeExpression(expressionNode);
                }
                if (!_analyzingStructure.Contain(invoker.NameWithParms))
                {
                    return;                                                          //TODO:报错 当前上文中不存在函数 ""
                }
                FunctionDefinition function = _analyzingStructure.GetFunctionDefinition(invoker.NameWithParms);
                if (_analyzingFunction.IsStatic && !function.IsStatic)
                {
                    return;                                                        //TODO:报错 对象引用对于非静态的字段、方法或属性 "" 是必须的
                }
                invoker.Function = function;
                invoker.Type     = function.ReturnType;
                if (invoker.NextElement != null)
                {
                    AnalyzeNextElement(invoker.NextElement, element.Type);
                }
                invoker.Type = invoker.LastElement.Type;     //由头一个标识符表示整串标识符的类型
                break;

            case NodeType.Array:
                ArrayNode array = (ArrayNode)element;
                if (!Symbols.Contain(array.Content))
                {
                    return;                                      //TODO:报错 当前上文中不存在标识符 ""
                }
                DefineVariableNode variableNode = Symbols[array.Content];
                if (_analyzingFunction.IsStatic && !variableNode.IsStatic)
                {
                    return;     //TODO:报错 对象引用对于非静态的字段、方法或属性 "" 是必须的
                }
                array.Definition = Symbols[array.Content];
                array.Type       = array.Definition.Type;
                foreach (ExpressionNode arrayExpression in array.Expressions)
                {
                    AnalyzeExpression(arrayExpression);
                    if (!Symbols.CanImplicitCast(arrayExpression.Type, Symbols.GetDefinition("int")))
                    {
                        return;                                                                                   //TODO:报错 无法将类型 "" 隐式转换为 ""
                    }
                }
                if (array.NextElement != null)
                {
                    AnalyzeNextElement(array.NextElement, array.Type);
                }
                array.Type = array.LastElement.Type;     //由头一个标识符表示整串标识符的类型
                break;
            }
        }