Exemplo n.º 1
0
        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();
            }
        }
Exemplo n.º 2
0
 public void EnterBinaryexpression([NotNull] sqfParser.BinaryexpressionContext context)
 {
     this.EnterGeneric(new SqfBinaryExpression(this.Current));
 }