private void VisitBodyStatement(ASTBodyStatementNode bodyNode) { foreach (var s in bodyNode.Statements) { VisitStatement(s); } }
/// <summary> /// Builds body statement /// </summary> /// <param name="bodyNode">Body statement node</param> private void BuildBodyStatement(ASTBodyStatementNode bodyNode) { foreach (var s in bodyNode.Statements) { BuildStatement(s); } }
public override void ExitSubStatement([NotNull] CmanParser.SubStatementContext context) { ASTSubStatementNode procNode; ASTBodyStatementNode bodyNode = null; if (_nodes.Peek() is ASTBodyStatementNode) { bodyNode = (ASTBodyStatementNode)_nodes.Pop(); } if (_nodes.Peek() is ASTArgListNode argListNode) { _nodes.Pop(); procNode = (ASTSubStatementNode)_nodes.Pop(); procNode.ArgList = argListNode; } else { procNode = (ASTSubStatementNode)_nodes.Pop(); } if (bodyNode != null) { procNode.Body = bodyNode; } var compileUnitNode = (ASTCompileUnitNode)_nodes.Peek(); compileUnitNode.AddProcedure(procNode); }
public override void ExitIfStatement([NotNull] CmanParser.IfStatementContext context) { ASTBodyStatementNode elseBody = null; ASTBodyStatementNode trueBody = null; IASTExprNode condition = null; if (_nodes.Peek() is ASTBodyStatementNode) { var tmp = _nodes.Pop(); if (_nodes.Peek() is ASTBodyStatementNode) { elseBody = (ASTBodyStatementNode)tmp; trueBody = (ASTBodyStatementNode)_nodes.Pop(); condition = (IASTExprNode)_nodes.Pop(); } else { trueBody = (ASTBodyStatementNode)tmp; condition = (IASTExprNode)_nodes.Pop(); } } else { condition = (IASTExprNode)_nodes.Pop(); //((ASTIfStatementNode)_nodes.Peek()).Condition = condition; } //TODO: ifnode не привязывает к себе ноды var ifNode = (ASTIfStatementNode)_nodes.Peek(); ifNode.Condition = condition; ifNode.TrueBody = trueBody; ifNode.ElseBody = elseBody; return; }
private void CheckBody(ASTBodyStatementNode bodyNode) { foreach (var s in bodyNode.Statements) { CheckStatement(s); } }
public override void ExitWhileStatement([NotNull] CmanParser.WhileStatementContext context) { ASTWhileStatementNode whileStmtNode; ASTBodyStatementNode bodyNode = null; if (_nodes.Peek() is ASTBodyStatementNode) { bodyNode = (ASTBodyStatementNode)_nodes.Pop(); } IASTExprNode condNode = (IASTExprNode)_nodes.Pop(); whileStmtNode = (ASTWhileStatementNode)_nodes.Peek(); whileStmtNode.Body = bodyNode; whileStmtNode.Condition = condNode; }
public override void ExitForStatement([NotNull] CmanParser.ForStatementContext context) { ASTBodyStatementNode body = null; IASTExprNode step = null; IASTExprNode cond = null; ASTNode counter = null; Queue <ASTNode> childs = new Queue <ASTNode>(); while (!(_nodes.Peek() is ASTForStatementNode)) { childs.Enqueue(_nodes.Pop()); //childs.Push(_nodes.Pop()); } //has body if (childs.Peek() is ASTBodyStatementNode) { body = (ASTBodyStatementNode)childs.Dequeue(); } int childCount = childs.Count(); //counter, condition, step if (childCount == 3) { step = (IASTExprNode)childs.Dequeue(); } cond = (IASTExprNode)childs.Dequeue(); counter = childs.Dequeue(); ASTForStatementNode forNode = (ASTForStatementNode)_nodes.Peek(); forNode.Counter = counter; forNode.Condition = cond; forNode.Step = step; forNode.Body = body; }