public override void Visit(ClassDeclNode node) { ClassBeingVisited = Analysis.Environment.Classes.Lookup(node.className.name); ClassBeingVisited.SizeInBytes = SizeOf(ClassBeingVisited); int Offset = 4; if (ClassBeingVisited.ClassType.BaseClassType != null) { Offset += SizeOf(Analysis.Environment.Classes.Lookup(ClassBeingVisited.ClassType.BaseClassType.Name)); } for (int x = 0; x < ClassBeingVisited.Fields.Count; x++) { FieldDefinition field = ClassBeingVisited.Fields.ItemAt(x); field.SizeInBytes = 4; Offset += field.SizeInBytes; field.Location = Offset; } if (node.methodDeclList != null) { for (int x = 0; x < node.methodDeclList.methodDeclList.Count; x++) { node.methodDeclList.MethodDeclAtIndex(x).Accept(this); } } }
public override void Visit(ClassDeclNode node) { ClassBeingVisited = Analysis.Environment.Classes.Lookup(node.className.name); if (node.extendsClass != null) { GenText(node.className.name + "$$ dd " + node.extendsClass.className.name + "$$"); } else { GenText(node.className.name + "$$ dd 0"); } Dictionary <string, string> VTable = GenerateVTable(ClassBeingVisited); Dictionary <string, string> .Enumerator enumerator = VTable.GetEnumerator(); int MethodOffset = 4; while (enumerator.MoveNext()) { GenText("\tdd " + enumerator.Current.Value + "$" + enumerator.Current.Key); if (ClassBeingVisited.Methods.Contains(enumerator.Current.Key)) { ClassBeingVisited.Methods.Lookup(enumerator.Current.Key).Location = MethodOffset; } MethodOffset += 4; } }
private static CompileResult DetectInNode(ASTNode node, Domain currentDomain) { return(node switch { ClassDeclNode classDeclNode => DetectClassDecl(classDeclNode, currentDomain), NamespaceDirectiveNode namespaceDirective => DetectNamespaceDecl(namespaceDirective, currentDomain), _ => new CompileResult(true) });
private static CompileResult SolveInNode(ASTNode node, Domain currentDomain) { return(node switch { NamespaceDirectiveNode namespaceDirective => SolveNamespaceElements(namespaceDirective, currentDomain), ClassDeclNode classDeclNode => SolveClassDecl(classDeclNode, currentDomain), _ => new CompileResult(true) });
public void Visit(ClassDeclNode n) { foreach (var node in n.GetChildren()) { node.SymTable = n.Table; node.Accept(this); } }
public void Visit(ClassDeclNode n) { PrintDOTIDLabel(n); PrintDOTParentChild(n); foreach (var child in n.GetChildren()) { child.Accept(this); } }
private static CompileResult DefineType(ASTNode node, Domain domain) { return(node switch { NamespaceDirectiveNode namespaceDirective => DefineNamespaceElements(namespaceDirective, domain), ClassDeclNode classDecl => DefineClass(classDecl, domain), FuncDeclNode funcDecl => DefineFunc(funcDecl, domain), _ => new CompileResult(true) });
public void Visit(ClassDeclNode n) { var children = n.GetChildren(); foreach (var child in children) { child.Accept(this); } }
public override void Visit(ClassDeclNode node) { ClassBeingVisited = Analysis.Environment.Classes.Lookup(node.className.name); if (node.extendsClass != null) { node.extendsClass.Accept(this); } }
/// <summary> /// Checks if the given class node is empty. Also adds the empty class /// node to code block of mRootImportNode. /// </summary> /// <param name="node">Given node</param> /// <returns>True if the given node is empty class node</returns> private bool AddToRootImportNodeIfEmpty(AssociativeNode node) { ClassDeclNode classNode = node as ClassDeclNode; if (null == classNode || !IsEmptyClassNode(classNode)) { return(false); } mRootImportNode.CodeNode.Body.Add(classNode); return(true); }
public override void Visit(ClassDeclNode node) { ClassType classType = new ClassType(node.className.name); ClassBeingVisited = Analysis.Environment.Classes.Add(node.className.name); ClassBeingVisited.ClassType = classType; if (node.extendsClass != null) { node.extendsClass.Accept(this); } }
private void CollectTypeInfo(ClassDeclNode node) { bool exists = types.Exists(node.ClassName); if (!exists) { types.AddType(new ClassType(node.ClassName)); } else { Log(string.Format("Объект с именем {0} уже существует", node.ClassName), node); } }
public void Visit(ClassDeclNode n) { var children = n.GetChildren(); n.Table.ClassName = children[0].Token.Lexeme; var inheritList = children[1].GetChildren().Select(x => x.Token.Lexeme); n.Table.Inherits.AddRange(inheritList); var memberDecls = children.GetCast <MemberDeclsNode>(2); memberDecls.Table = n.Table; memberDecls.Accept(this); }
private void Visit(ClassDeclNode node, TypeInfo type) { var classType = types.GetType(node.ClassName) as ClassType; foreach (dynamic item in node.ClassDecls) { Visit(item, classType); } var constructor = new ConstructorInfo(false, classType); foreach (var item in classType.Fields) { constructor.AddArg(item.Name, item.Type); } classType.AddConstructor(constructor); }
public virtual void Visit(ClassDeclNode node) { ClassBeingVisited = Analysis.Environment.Classes.Lookup(node.className.name); if (node.extendsClass != null) { node.extendsClass.Accept(this); } if (node.variableDeclList != null) { for (int x = 0; x < node.variableDeclList.variableDeclList.Count; x++) { node.variableDeclList.VariableDeclAtIndex(x).Accept(this); } } if (node.methodDeclList != null) { for (int x = 0; x < node.methodDeclList.methodDeclList.Count; x++) { node.methodDeclList.MethodDeclAtIndex(x).Accept(this); } } }
public override void Visit(ClassDeclNode node) { ClassBeingVisited = Analysis.Environment.Classes.Lookup(node.className.name); if (node.variableDeclList != null) { for (int x = 0; x < node.variableDeclList.variableDeclList.Count; x++) { FieldDefinition fieldDefinition = ClassBeingVisited.Fields.Add(node.variableDeclList.VariableDeclAtIndex(x).identifier.name); fieldDefinition.FieldType = node.variableDeclList.VariableDeclAtIndex(x).type.Type; if (fieldDefinition.FieldType.GetType() == typeof(ClassType)) { Analysis.Environment.Classes.Lookup(fieldDefinition.FieldType.Name); } } } if (node.methodDeclList != null) { for (int x = 0; x < node.methodDeclList.methodDeclList.Count; x++) { node.methodDeclList.MethodDeclAtIndex(x).Accept(this); } } }
public override void Visit(ClassDeclNode node) { Console.WriteLine(this.indentation + "Class <Identifier: " + node.className.name + "> ---- Class Declaration ----"); indentation = indentation + " "; if (node.extendsClass != null) { node.extendsClass.Accept(this); } if (node.variableDeclList != null) { for (int x = 0; x < node.variableDeclList.variableDeclList.Count; x++) { node.variableDeclList.VariableDeclAtIndex(x).Accept(this); } } if (node.methodDeclList != null) { for (int x = 0; x < node.methodDeclList.methodDeclList.Count; x++) { node.methodDeclList.MethodDeclAtIndex(x).Accept(this); } } indentation = indentation.Substring(0, indentation.Length - 3); }
public virtual bool VisitClassDeclNode(ClassDeclNode node) { return(DefaultVisit(node)); }
protected override void DoAction(int action) { switch (action) { case 2: // Program -> MainClassDecl, ClassDeclList_Opt { CurrentSemanticValue = new ProgramNode((MainClassDeclNode)ValueStack[ValueStack.Depth - 2], (ClassDeclListNode)ValueStack[ValueStack.Depth - 1], LineNumber); Analysis.AST = (ProgramNode)CurrentSemanticValue; } break; case 3: // MainClassDecl -> ClassKeyword, Identifier, CurlyBracketOpen, PublicKeyword, // StaticKeyword, VoidKeyword, MainKeyword, RoundBracketOpen, // StringKeyword, SquareBracketOpen, SquareBracketClose, // Identifier, RoundBracketClose, CurlyBracketOpen, Statement, // CurlyBracketClose, CurlyBracketClose { CurrentSemanticValue = new MainClassDeclNode((IdentifierNode)ValueStack[ValueStack.Depth - 16], (IdentifierNode)ValueStack[ValueStack.Depth - 6], (StatementNode)ValueStack[ValueStack.Depth - 3], LineNumber); } break; case 4: // ClassDeclList_Opt -> ClassDeclList_Opt, ClassDecl { ((ClassDeclListNode)ValueStack[ValueStack.Depth - 2]).AddClassDecl((ClassDeclNode)ValueStack[ValueStack.Depth - 1]); CurrentSemanticValue = ValueStack[ValueStack.Depth - 2]; } break; case 5: // ClassDeclList_Opt -> /* empty */ { CurrentSemanticValue = new ClassDeclListNode(LineNumber); } break; case 6: // ClassDecl -> ClassKeyword, Identifier, Extends_Opt, CurlyBracketOpen, // VariableDeclList_Opt, MethodDeclList_Opt, CurlyBracketClose { CurrentSemanticValue = new ClassDeclNode((IdentifierNode)ValueStack[ValueStack.Depth - 6], (ExtendsNode)ValueStack[ValueStack.Depth - 5], (VariableDeclListNode)ValueStack[ValueStack.Depth - 3], (MethodDeclListNode)ValueStack[ValueStack.Depth - 2], LineNumber); } break; case 7: // Extends_Opt -> ExtendsKeyword, Identifier { CurrentSemanticValue = new ExtendsNode((IdentifierNode)ValueStack[ValueStack.Depth - 1], LineNumber); } break; case 9: // MethodDeclList_Opt -> MethodDeclList_Opt, MethodDecl { ((MethodDeclListNode)ValueStack[ValueStack.Depth - 2]).AddMethodDecl((MethodDeclNode)ValueStack[ValueStack.Depth - 1]); CurrentSemanticValue = ValueStack[ValueStack.Depth - 2]; } break; case 10: // MethodDeclList_Opt -> /* empty */ { CurrentSemanticValue = new MethodDeclListNode(LineNumber); } break; case 11: // MethodDecl -> PublicKeyword, Type, Identifier, RoundBracketOpen, // ParamDeclList_Opt, RoundBracketClose, CurlyBracketOpen, // VariableDeclList_Opt, StatementListEndingInReturn, // CurlyBracketClose { ((StatementListNode)ValueStack[ValueStack.Depth - 2]).statementList.Reverse(); CurrentSemanticValue = new MethodDeclNode((TypeNode)ValueStack[ValueStack.Depth - 9], (IdentifierNode)ValueStack[ValueStack.Depth - 8], (ParamDeclListNode)ValueStack[ValueStack.Depth - 6], (VariableDeclListNode)ValueStack[ValueStack.Depth - 3], (StatementListNode)ValueStack[ValueStack.Depth - 2], LineNumber); } break; case 12: // VariableDeclList_Opt -> VariableDeclList_Opt, VariableDecl { ((VariableDeclListNode)ValueStack[ValueStack.Depth - 2]).AddVariableDecl((VariableDeclNode)ValueStack[ValueStack.Depth - 1]); CurrentSemanticValue = ValueStack[ValueStack.Depth - 2]; } break; case 13: // VariableDeclList_Opt -> /* empty */ { CurrentSemanticValue = new VariableDeclListNode(LineNumber); } break; case 14: // VariableDecl -> Type, Identifier, SemiColon { CurrentSemanticValue = new VariableDeclNode((TypeNode)ValueStack[ValueStack.Depth - 3], (IdentifierNode)ValueStack[ValueStack.Depth - 2], LineNumber); } break; case 15: // StatementListEndingInReturn -> Statement, StatementListEndingInReturn { ((StatementListNode)ValueStack[ValueStack.Depth - 1]).AddStatement((StatementNode)ValueStack[ValueStack.Depth - 2]); CurrentSemanticValue = ValueStack[ValueStack.Depth - 1]; } break; case 16: // StatementListEndingInReturn -> ReturnKeyword, Expr, SemiColon { CurrentSemanticValue = new StatementListNode(LineNumber); ((StatementListNode)CurrentSemanticValue).AddStatement(new ReturnStatementNode((ExpressionNode)ValueStack[ValueStack.Depth - 2], LineNumber)); } break; case 17: // ParamDeclList_Opt -> Type, Identifier, ParamDeclListRest_Opt { ((ParamDeclListNode)ValueStack[ValueStack.Depth - 1]).paramDeclList.Reverse(); ((ParamDeclListNode)ValueStack[ValueStack.Depth - 1]).AddParamDecl(new ParamDeclNode((TypeNode)ValueStack[ValueStack.Depth - 3], (IdentifierNode)ValueStack[ValueStack.Depth - 2], LineNumber)); ((ParamDeclListNode)ValueStack[ValueStack.Depth - 1]).paramDeclList.Reverse(); CurrentSemanticValue = ValueStack[ValueStack.Depth - 1]; } break; case 19: // ParamDeclListRest_Opt -> ParamDeclListRest_Opt, Comma, Type, Identifier { ((ParamDeclListNode)ValueStack[ValueStack.Depth - 4]).AddParamDecl(new ParamDeclNode((TypeNode)ValueStack[ValueStack.Depth - 2], (IdentifierNode)ValueStack[ValueStack.Depth - 1], LineNumber)); CurrentSemanticValue = ValueStack[ValueStack.Depth - 4]; } break; case 20: // ParamDeclListRest_Opt -> /* empty */ { CurrentSemanticValue = new ParamDeclListNode(LineNumber); } break; case 21: // Type -> IntKeyword, SquareBracketOpen, SquareBracketClose { CurrentSemanticValue = new IntegerArrayTypeNode(LineNumber); } break; case 22: // Type -> IntKeyword { CurrentSemanticValue = new IntegerTypeNode(LineNumber); } break; case 23: // Type -> BooleanKeyword { CurrentSemanticValue = new BooleanTypeNode(LineNumber); } break; case 24: // Type -> Identifier { CurrentSemanticValue = new IdentifierTypeNode(((IdentifierNode)ValueStack[ValueStack.Depth - 1]).name, LineNumber); } break; case 25: // Statement -> CurlyBracketOpen, StatementList_Opt, CurlyBracketClose { CurrentSemanticValue = new StatementBlockNode((StatementListNode)ValueStack[ValueStack.Depth - 2], LineNumber); } break; case 26: // Statement -> IfKeyword, RoundBracketOpen, Expr, RoundBracketClose, Statement, // ElseKeyword, Statement { CurrentSemanticValue = new IfStatementNode((ExpressionNode)ValueStack[ValueStack.Depth - 5], (StatementNode)ValueStack[ValueStack.Depth - 3], (StatementNode)ValueStack[ValueStack.Depth - 1], LineNumber); } break; case 27: // Statement -> WhileKeyword, RoundBracketOpen, Expr, RoundBracketClose, Statement { CurrentSemanticValue = new WhileStatementNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], (StatementNode)ValueStack[ValueStack.Depth - 1], LineNumber); } break; case 28: // Statement -> SystemOutPrintLnKeyword, RoundBracketOpen, Expr, RoundBracketClose, // SemiColon { CurrentSemanticValue = new SystemOutPrintLnStatementNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], LineNumber); } break; case 29: // Statement -> Identifier, EqualsOperator, Expr, SemiColon { CurrentSemanticValue = new AssignmentStatementNode((IdentifierNode)ValueStack[ValueStack.Depth - 4], (ExpressionNode)ValueStack[ValueStack.Depth - 2], LineNumber); } break; case 30: // Statement -> Identifier, Dot, Identifier, EqualsOperator, Expr, SemiColon { CurrentSemanticValue = new FieldAssignmentStatementNode((IdentifierNode)ValueStack[ValueStack.Depth - 6], (IdentifierNode)ValueStack[ValueStack.Depth - 4], (ExpressionNode)ValueStack[ValueStack.Depth - 2], LineNumber); } break; case 31: // Statement -> Identifier, SquareBracketOpen, Expr, SquareBracketClose, // EqualsOperator, Expr, SemiColon { CurrentSemanticValue = new ArrayAssignmentStatementNode((IdentifierNode)ValueStack[ValueStack.Depth - 7], (ExpressionNode)ValueStack[ValueStack.Depth - 5], (ExpressionNode)ValueStack[ValueStack.Depth - 2], LineNumber); } break; case 32: // Statement -> error, SemiColon { CurrentSemanticValue = new StatementBlockNode(new StatementListNode(LineNumber), LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); } break; case 33: // Statement -> error, CurlyBracketClose { CurrentSemanticValue = new StatementBlockNode(new StatementListNode(LineNumber), LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); } break; case 34: // StatementList_Opt -> StatementList_Opt, Statement { ((StatementListNode)ValueStack[ValueStack.Depth - 2]).AddStatement((StatementNode)ValueStack[ValueStack.Depth - 1]); CurrentSemanticValue = ValueStack[ValueStack.Depth - 2]; } break; case 35: // StatementList_Opt -> /* empty */ { CurrentSemanticValue = new StatementListNode(LineNumber); } break; case 36: // Expr -> RoundBracketOpen, Expr, RoundBracketClose { CurrentSemanticValue = ValueStack[ValueStack.Depth - 2]; } break; case 37: // Expr -> NotOperator, Expr { CurrentSemanticValue = new NotExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 1], LineNumber); } break; case 38: // Expr -> NewKeyword, IntKeyword, SquareBracketOpen, Expr, SquareBracketClose { CurrentSemanticValue = new NewIntegerArrayExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 2], LineNumber); } break; case 39: // Expr -> NewKeyword, Identifier, RoundBracketOpen, RoundBracketClose { CurrentSemanticValue = new NewObjectExpressionNode((IdentifierNode)ValueStack[ValueStack.Depth - 3], LineNumber); } break; case 40: // Expr -> Expr, AndAndOperator, Expr { CurrentSemanticValue = new AndExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], (ExpressionNode)ValueStack[ValueStack.Depth - 1], LineNumber); } break; case 41: // Expr -> Expr, LessThanOperator, Expr { CurrentSemanticValue = new LessThanExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], (ExpressionNode)ValueStack[ValueStack.Depth - 1], LineNumber); } break; case 42: // Expr -> Expr, AddOperator, Expr { CurrentSemanticValue = new AddExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], (ExpressionNode)ValueStack[ValueStack.Depth - 1], LineNumber); } break; case 43: // Expr -> Expr, SubtractOperator, Expr { CurrentSemanticValue = new SubtractExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], (ExpressionNode)ValueStack[ValueStack.Depth - 1], LineNumber); } break; case 44: // Expr -> Expr, MultiplyOperator, Expr { CurrentSemanticValue = new MultiplyExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], (ExpressionNode)ValueStack[ValueStack.Depth - 1], LineNumber); } break; case 45: // Expr -> Expr, SquareBracketOpen, Expr, SquareBracketClose { CurrentSemanticValue = new ArrayLookupExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 4], (ExpressionNode)ValueStack[ValueStack.Depth - 2], LineNumber); } break; case 46: // Expr -> Expr, Dot, LengthKeyword { CurrentSemanticValue = new LengthExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], LineNumber); } break; case 47: // Expr -> Expr, Dot, Identifier { CurrentSemanticValue = new FieldAccessExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], (IdentifierNode)ValueStack[ValueStack.Depth - 1], LineNumber); } break; case 48: // Expr -> Expr, Dot, Identifier, RoundBracketOpen, ExprList_Opt, // RoundBracketClose { CurrentSemanticValue = new MethodCallExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 6], (IdentifierNode)ValueStack[ValueStack.Depth - 4], (ExpressionListNode)ValueStack[ValueStack.Depth - 2], LineNumber); } break; case 49: // Expr -> ThisKeyword { CurrentSemanticValue = new ThisExpressionNode(LineNumber); } break; case 50: // Expr -> Identifier { CurrentSemanticValue = new IdentifierExpressionNode((IdentifierNode)ValueStack[ValueStack.Depth - 1], LineNumber); } break; case 51: // Expr -> IntegerConstant { CurrentSemanticValue = ValueStack[ValueStack.Depth - 1]; } break; case 52: // Expr -> TrueKeyword { CurrentSemanticValue = ValueStack[ValueStack.Depth - 1]; } break; case 53: // Expr -> FalseKeyword { CurrentSemanticValue = ValueStack[ValueStack.Depth - 1]; } break; case 54: // Expr -> error, IntegerConstant { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); } break; case 55: // Expr -> error, TrueKeyword { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); } break; case 56: // Expr -> error, FalseKeyword { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); } break; case 57: // Expr -> error, Identifier { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); } break; case 58: // Expr -> error, ThisKeyword { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); } break; case 59: // Expr -> error, SquareBracketClose { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); } break; case 60: // Expr -> error, RoundBracketClose { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); } break; case 61: // Expr -> error, LengthKeyword { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); } break; case 62: // ExprList_Opt -> Expr, ExprListRest_Opt { ((ExpressionListNode)ValueStack[ValueStack.Depth - 1]).expressionList.Reverse(); ((ExpressionListNode)ValueStack[ValueStack.Depth - 1]).AddExpression((ExpressionNode)ValueStack[ValueStack.Depth - 2]); ((ExpressionListNode)ValueStack[ValueStack.Depth - 1]).expressionList.Reverse(); CurrentSemanticValue = ValueStack[ValueStack.Depth - 1]; } break; case 63: // ExprList_Opt -> /* empty */ { new ExpressionListNode(LineNumber); } break; case 64: // ExprListRest_Opt -> ExprListRest_Opt, Comma, Expr { ((ExpressionListNode)ValueStack[ValueStack.Depth - 3]).AddExpression((ExpressionNode)ValueStack[ValueStack.Depth - 1]); CurrentSemanticValue = ValueStack[ValueStack.Depth - 3]; } break; case 65: // ExprListRest_Opt -> /* empty */ { CurrentSemanticValue = new ExpressionListNode(LineNumber); } break; } }
public virtual TAssociative VisitClassDeclNode(ClassDeclNode node) { return(VisitAssociativeNode(node)); }
public virtual void VisitClassDeclNode(ClassDeclNode node) { DefaultVisit(node); }
private void Initialize(ClassDeclNode classDeclNode) { }