public void ExitBinaryexpression([NotNull] sqfParser.BinaryexpressionContext context) { var node = this.ExitGeneric <SqfBinaryExpression>(context); var idents = context.IDENTIFIER(); var ops = context.OPERATOR(); var terminalList = new List <ITerminalNode>(idents.Length + ops.Length); var identIndex = 0; var opIndex = 0; while (true) { var ident = idents.Length >= identIndex ? null : idents[identIndex]; var op = ops.Length >= opIndex ? null : ops[opIndex]; if (op == null && ident == null) { break; } if (op == null || ident.Symbol.StartIndex < op.Symbol.StartIndex) { terminalList.Add(ident); } else if (ident == null || ident.Symbol.StartIndex > op.Symbol.StartIndex) { terminalList.Add(op); } else { break; } } if (terminalList.Count == 0) { node.RemoveFromTree(); } else { int index = 0; SqfBinaryExpression lastExp = node; while (node.Children.Count > 1) { SqfBinaryExpression exp = new SqfBinaryExpression(node); exp.LValue = node.Children[0]; exp.RValue = node.Children[1]; exp.AddChild(exp.LValue); exp.AddChild(exp.RValue); exp.Length = exp.RValue.StartOffset - lastExp.StartOffset + exp.RValue.Length; exp.Operation = terminalList[index++].GetText(); exp.Line = exp.LValue.Line; node.Children.Remove(exp.LValue); node.Children.Remove(exp.RValue); node.Children.Insert(0, exp); lastExp = exp; } node.RemoveFromTree(); } }
public void EnterBinaryexpression([NotNull] sqfParser.BinaryexpressionContext context) { this.EnterGeneric(new SqfBinaryExpression(this.Current)); }