#pragma warning disable 219
// $ANTLR 3.2 Sep 23, 2009 12:02:23 C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g 2009-11-11 17:56:42

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using Unity.VisualScripting.Antlr3.Runtime;
using Unity.VisualScripting.Antlr3.Runtime.Tree;

namespace Unity.VisualScripting.Dependencies.NCalc
{
    public class NCalcParser : Parser
    {
        // delegates
        // delegators

        public NCalcParser(ITokenStream input)
            : this(input, new RecognizerSharedState()) { }

        public NCalcParser(ITokenStream input, RecognizerSharedState state)
            : base(input, state)
        {
            InitializeCyclicDFAs();
        }

        protected ITreeAdaptor adaptor = new CommonTreeAdaptor();

        public ITreeAdaptor TreeAdaptor
        {
            get
            {
                return adaptor;
            }
            set
            {
                adaptor = value;
            }
        }

        override public string[] TokenNames
        {
            get
            {
                return tokenNames;
            }
        }

        override public string GrammarFileName
        {
            get
            {
                return "C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g";
            }
        }

        public List<string> Errors { get; private set; }

        // $ANTLR end "arguments"

        // Delegated rules

        private void InitializeCyclicDFAs() { }

        private string extractString(string text)
        {
            var sb = new StringBuilder(text);
            var startIndex = 1; // Skip initial quote
            var slashIndex = -1;

            while ((slashIndex = sb.ToString().IndexOf(BS, startIndex)) != -1)
            {
                var escapeType = sb[slashIndex + 1];
                switch (escapeType)
                {
                    case 'u':
                        var hcode = String.Concat(sb[slashIndex + 4], sb[slashIndex + 5]);
                        var lcode = String.Concat(sb[slashIndex + 2], sb[slashIndex + 3]);
                        var unicodeChar = Encoding.Unicode.GetChars(new[] { Convert.ToByte(hcode, 16), Convert.ToByte(lcode, 16) })[0];
                        sb.Remove(slashIndex, 6).Insert(slashIndex, unicodeChar);
                        break;
                    case 'n':
                        sb.Remove(slashIndex, 2).Insert(slashIndex, '\n');
                        break;
                    case 'r':
                        sb.Remove(slashIndex, 2).Insert(slashIndex, '\r');
                        break;
                    case 't':
                        sb.Remove(slashIndex, 2).Insert(slashIndex, '\t');
                        break;
                    case '\'':
                        sb.Remove(slashIndex, 2).Insert(slashIndex, '\'');
                        break;
                    case '\\':
                        sb.Remove(slashIndex, 2).Insert(slashIndex, '\\');
                        break;
                    default:
                        throw new RecognitionException("Unvalid escape sequence: \\" + escapeType);
                }

                startIndex = slashIndex + 1;
            }

            sb.Remove(0, 1);
            sb.Remove(sb.Length - 1, 1);

            return sb.ToString();
        }

        public override void DisplayRecognitionError(String[] tokenNames, RecognitionException e)
        {
            base.DisplayRecognitionError(tokenNames, e);

            if (Errors == null)
            {
                Errors = new List<string>();
            }

            var hdr = GetErrorHeader(e);
            var msg = GetErrorMessage(e, tokenNames);
            Errors.Add(msg + " at " + hdr);
        }

        // $ANTLR start "ncalcExpression"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:77:1: ncalcExpression returns [LogicalExpression value] : logicalExpression EOF ;
        public ncalcExpression_return ncalcExpression() // throws RecognitionException [1]
        {
            var retval = new ncalcExpression_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken EOF2 = null;
            logicalExpression_return logicalExpression1 = null;

            CommonTree EOF2_tree = null;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:78:2: ( logicalExpression EOF )
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:78:4: logicalExpression EOF
                {
                    root_0 = (CommonTree)adaptor.GetNilNode();

                    PushFollow(FOLLOW_logicalExpression_in_ncalcExpression56);
                    logicalExpression1 = logicalExpression();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, logicalExpression1.Tree);
                    EOF2 = (IToken)Match(input, EOF, FOLLOW_EOF_in_ncalcExpression58);
                    retval.value = logicalExpression1 != null ? logicalExpression1.value : null;
                }

                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "logicalExpression"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:81:1: logicalExpression returns [LogicalExpression value] : left= conditionalExpression ( '?' middle= conditionalExpression ':' right= conditionalExpression )? ;
        public logicalExpression_return logicalExpression() // throws RecognitionException [1]
        {
            var retval = new logicalExpression_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken char_literal3 = null;
            IToken char_literal4 = null;
            conditionalExpression_return left = null;

            conditionalExpression_return middle = null;

            conditionalExpression_return right = null;

            CommonTree char_literal3_tree = null;
            CommonTree char_literal4_tree = null;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:82:2: (left= conditionalExpression ( '?' middle= conditionalExpression ':' right= conditionalExpression )? )
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:82:4: left= conditionalExpression ( '?' middle= conditionalExpression ':' right= conditionalExpression )?
                {
                    root_0 = (CommonTree)adaptor.GetNilNode();

                    PushFollow(FOLLOW_conditionalExpression_in_logicalExpression78);
                    left = conditionalExpression();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, left.Tree);
                    retval.value = left != null ? left.value : null;
                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:82:57: ( '?' middle= conditionalExpression ':' right= conditionalExpression )?
                    var alt1 = 2;
                    var LA1_0 = input.LA(1);

                    if (LA1_0 == 19)
                    {
                        alt1 = 1;
                    }
                    switch (alt1)
                    {
                        case 1:
                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:82:59: '?' middle= conditionalExpression ':' right= conditionalExpression
                            {
                                char_literal3 = (IToken)Match(input, 19, FOLLOW_19_in_logicalExpression84);
                                char_literal3_tree = (CommonTree)adaptor.Create(char_literal3);
                                adaptor.AddChild(root_0, char_literal3_tree);

                                PushFollow(FOLLOW_conditionalExpression_in_logicalExpression88);
                                middle = conditionalExpression();
                                state.followingStackPointer--;

                                adaptor.AddChild(root_0, middle.Tree);
                                char_literal4 = (IToken)Match(input, 20, FOLLOW_20_in_logicalExpression90);
                                char_literal4_tree = (CommonTree)adaptor.Create(char_literal4);
                                adaptor.AddChild(root_0, char_literal4_tree);

                                PushFollow(FOLLOW_conditionalExpression_in_logicalExpression94);
                                right = conditionalExpression();
                                state.followingStackPointer--;

                                adaptor.AddChild(root_0, right.Tree);
                                retval.value = new TernaryExpression(left != null ? left.value : null, middle != null ? middle.value : null, right != null ? right.value : null);
                            }
                            break;
                    }
                }

                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "conditionalExpression"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:85:1: conditionalExpression returns [LogicalExpression value] : left= booleanAndExpression ( ( '||' | 'or' ) right= conditionalExpression )* ;
        public conditionalExpression_return conditionalExpression() // throws RecognitionException [1]
        {
            var retval = new conditionalExpression_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken set5 = null;
            booleanAndExpression_return left = null;

            conditionalExpression_return right = null;

            CommonTree set5_tree = null;

            var type = BinaryExpressionType.Unknown;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:89:2: (left= booleanAndExpression ( ( '||' | 'or' ) right= conditionalExpression )* )
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:89:4: left= booleanAndExpression ( ( '||' | 'or' ) right= conditionalExpression )*
                {
                    root_0 = (CommonTree)adaptor.GetNilNode();

                    PushFollow(FOLLOW_booleanAndExpression_in_conditionalExpression121);
                    left = booleanAndExpression();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, left.Tree);
                    retval.value = left != null ? left.value : null;
                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:89:56: ( ( '||' | 'or' ) right= conditionalExpression )*
                    do
                    {
                        var alt2 = 2;
                        var LA2_0 = input.LA(1);

                        if (LA2_0 >= 21 && LA2_0 <= 22)
                        {
                            alt2 = 1;
                        }

                        switch (alt2)
                        {
                            case 1:
                                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:90:4: ( '||' | 'or' ) right= conditionalExpression
                                {
                                    set5 = (IToken)input.LT(1);
                                    if (input.LA(1) >= 21 && input.LA(1) <= 22)
                                    {
                                        input.Consume();
                                        adaptor.AddChild(root_0, (CommonTree)adaptor.Create(set5));
                                        state.errorRecovery = false;
                                    }
                                    else
                                    {
                                        var mse = new MismatchedSetException(null, input);
                                        throw mse;
                                    }

                                    type = BinaryExpressionType.Or;
                                    PushFollow(FOLLOW_conditionalExpression_in_conditionalExpression146);
                                    right = conditionalExpression();
                                    state.followingStackPointer--;

                                    adaptor.AddChild(root_0, right.Tree);
                                    retval.value = new BinaryExpression(type, retval.value, right != null ? right.value : null);
                                }
                                break;

                            default:
                                goto loop2;
                        }
                    }
                    while (true);

                loop2:
                    ; // Stops C# compiler whining that label 'loop2' has no statements
                }

                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "booleanAndExpression"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:95:1: booleanAndExpression returns [LogicalExpression value] : left= bitwiseOrExpression ( ( '&&' | 'and' ) right= bitwiseOrExpression )* ;
        public booleanAndExpression_return booleanAndExpression() // throws RecognitionException [1]
        {
            var retval = new booleanAndExpression_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken set6 = null;
            bitwiseOrExpression_return left = null;

            bitwiseOrExpression_return right = null;

            CommonTree set6_tree = null;

            var type = BinaryExpressionType.Unknown;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:99:2: (left= bitwiseOrExpression ( ( '&&' | 'and' ) right= bitwiseOrExpression )* )
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:99:4: left= bitwiseOrExpression ( ( '&&' | 'and' ) right= bitwiseOrExpression )*
                {
                    root_0 = (CommonTree)adaptor.GetNilNode();

                    PushFollow(FOLLOW_bitwiseOrExpression_in_booleanAndExpression180);
                    left = bitwiseOrExpression();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, left.Tree);
                    retval.value = left != null ? left.value : null;
                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:99:55: ( ( '&&' | 'and' ) right= bitwiseOrExpression )*
                    do
                    {
                        var alt3 = 2;
                        var LA3_0 = input.LA(1);

                        if (LA3_0 >= 23 && LA3_0 <= 24)
                        {
                            alt3 = 1;
                        }

                        switch (alt3)
                        {
                            case 1:
                                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:100:4: ( '&&' | 'and' ) right= bitwiseOrExpression
                                {
                                    set6 = (IToken)input.LT(1);
                                    if (input.LA(1) >= 23 && input.LA(1) <= 24)
                                    {
                                        input.Consume();
                                        adaptor.AddChild(root_0, (CommonTree)adaptor.Create(set6));
                                        state.errorRecovery = false;
                                    }
                                    else
                                    {
                                        var mse = new MismatchedSetException(null, input);
                                        throw mse;
                                    }

                                    type = BinaryExpressionType.And;
                                    PushFollow(FOLLOW_bitwiseOrExpression_in_booleanAndExpression205);
                                    right = bitwiseOrExpression();
                                    state.followingStackPointer--;

                                    adaptor.AddChild(root_0, right.Tree);
                                    retval.value = new BinaryExpression(type, retval.value, right != null ? right.value : null);
                                }
                                break;

                            default:
                                goto loop3;
                        }
                    }
                    while (true);

                loop3:
                    ; // Stops C# compiler whining that label 'loop3' has no statements
                }

                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "bitwiseOrExpression"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:105:1: bitwiseOrExpression returns [LogicalExpression value] : left= bitwiseXOrExpression ( '|' right= bitwiseOrExpression )* ;
        public bitwiseOrExpression_return bitwiseOrExpression() // throws RecognitionException [1]
        {
            var retval = new bitwiseOrExpression_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken char_literal7 = null;
            bitwiseXOrExpression_return left = null;

            bitwiseOrExpression_return right = null;

            CommonTree char_literal7_tree = null;

            var type = BinaryExpressionType.Unknown;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:109:2: (left= bitwiseXOrExpression ( '|' right= bitwiseOrExpression )* )
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:109:4: left= bitwiseXOrExpression ( '|' right= bitwiseOrExpression )*
                {
                    root_0 = (CommonTree)adaptor.GetNilNode();

                    PushFollow(FOLLOW_bitwiseXOrExpression_in_bitwiseOrExpression237);
                    left = bitwiseXOrExpression();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, left.Tree);
                    retval.value = left != null ? left.value : null;
                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:109:56: ( '|' right= bitwiseOrExpression )*
                    do
                    {
                        var alt4 = 2;
                        var LA4_0 = input.LA(1);

                        if (LA4_0 == 25)
                        {
                            alt4 = 1;
                        }

                        switch (alt4)
                        {
                            case 1:
                                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:110:4: '|' right= bitwiseOrExpression
                                {
                                    char_literal7 = (IToken)Match(input, 25, FOLLOW_25_in_bitwiseOrExpression246);
                                    char_literal7_tree = (CommonTree)adaptor.Create(char_literal7);
                                    adaptor.AddChild(root_0, char_literal7_tree);

                                    type = BinaryExpressionType.BitwiseOr;
                                    PushFollow(FOLLOW_bitwiseOrExpression_in_bitwiseOrExpression256);
                                    right = bitwiseOrExpression();
                                    state.followingStackPointer--;

                                    adaptor.AddChild(root_0, right.Tree);
                                    retval.value = new BinaryExpression(type, retval.value, right != null ? right.value : null);
                                }
                                break;

                            default:
                                goto loop4;
                        }
                    }
                    while (true);

                loop4:
                    ; // Stops C# compiler whining that label 'loop4' has no statements
                }

                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "bitwiseXOrExpression"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:115:1: bitwiseXOrExpression returns [LogicalExpression value] : left= bitwiseAndExpression ( '^' right= bitwiseAndExpression )* ;
        public bitwiseXOrExpression_return bitwiseXOrExpression() // throws RecognitionException [1]
        {
            var retval = new bitwiseXOrExpression_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken char_literal8 = null;
            bitwiseAndExpression_return left = null;

            bitwiseAndExpression_return right = null;

            CommonTree char_literal8_tree = null;

            var type = BinaryExpressionType.Unknown;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:119:2: (left= bitwiseAndExpression ( '^' right= bitwiseAndExpression )* )
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:119:4: left= bitwiseAndExpression ( '^' right= bitwiseAndExpression )*
                {
                    root_0 = (CommonTree)adaptor.GetNilNode();

                    PushFollow(FOLLOW_bitwiseAndExpression_in_bitwiseXOrExpression290);
                    left = bitwiseAndExpression();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, left.Tree);
                    retval.value = left != null ? left.value : null;
                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:119:56: ( '^' right= bitwiseAndExpression )*
                    do
                    {
                        var alt5 = 2;
                        var LA5_0 = input.LA(1);

                        if (LA5_0 == 26)
                        {
                            alt5 = 1;
                        }

                        switch (alt5)
                        {
                            case 1:
                                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:120:4: '^' right= bitwiseAndExpression
                                {
                                    char_literal8 = (IToken)Match(input, 26, FOLLOW_26_in_bitwiseXOrExpression299);
                                    char_literal8_tree = (CommonTree)adaptor.Create(char_literal8);
                                    adaptor.AddChild(root_0, char_literal8_tree);

                                    type = BinaryExpressionType.BitwiseXOr;
                                    PushFollow(FOLLOW_bitwiseAndExpression_in_bitwiseXOrExpression309);
                                    right = bitwiseAndExpression();
                                    state.followingStackPointer--;

                                    adaptor.AddChild(root_0, right.Tree);
                                    retval.value = new BinaryExpression(type, retval.value, right != null ? right.value : null);
                                }
                                break;

                            default:
                                goto loop5;
                        }
                    }
                    while (true);

                loop5:
                    ; // Stops C# compiler whining that label 'loop5' has no statements
                }

                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "bitwiseAndExpression"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:125:1: bitwiseAndExpression returns [LogicalExpression value] : left= equalityExpression ( '&' right= equalityExpression )* ;
        public bitwiseAndExpression_return bitwiseAndExpression() // throws RecognitionException [1]
        {
            var retval = new bitwiseAndExpression_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken char_literal9 = null;
            equalityExpression_return left = null;

            equalityExpression_return right = null;

            CommonTree char_literal9_tree = null;

            var type = BinaryExpressionType.Unknown;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:129:2: (left= equalityExpression ( '&' right= equalityExpression )* )
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:129:4: left= equalityExpression ( '&' right= equalityExpression )*
                {
                    root_0 = (CommonTree)adaptor.GetNilNode();

                    PushFollow(FOLLOW_equalityExpression_in_bitwiseAndExpression341);
                    left = equalityExpression();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, left.Tree);
                    retval.value = left != null ? left.value : null;
                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:129:54: ( '&' right= equalityExpression )*
                    do
                    {
                        var alt6 = 2;
                        var LA6_0 = input.LA(1);

                        if (LA6_0 == 27)
                        {
                            alt6 = 1;
                        }

                        switch (alt6)
                        {
                            case 1:
                                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:130:4: '&' right= equalityExpression
                                {
                                    char_literal9 = (IToken)Match(input, 27, FOLLOW_27_in_bitwiseAndExpression350);
                                    char_literal9_tree = (CommonTree)adaptor.Create(char_literal9);
                                    adaptor.AddChild(root_0, char_literal9_tree);

                                    type = BinaryExpressionType.BitwiseAnd;
                                    PushFollow(FOLLOW_equalityExpression_in_bitwiseAndExpression360);
                                    right = equalityExpression();
                                    state.followingStackPointer--;

                                    adaptor.AddChild(root_0, right.Tree);
                                    retval.value = new BinaryExpression(type, retval.value, right != null ? right.value : null);
                                }
                                break;

                            default:
                                goto loop6;
                        }
                    }
                    while (true);

                loop6:
                    ; // Stops C# compiler whining that label 'loop6' has no statements
                }

                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "equalityExpression"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:135:1: equalityExpression returns [LogicalExpression value] : left= relationalExpression ( ( ( '==' | '=' ) | ( '!=' | '<>' ) ) right= relationalExpression )* ;
        public equalityExpression_return equalityExpression() // throws RecognitionException [1]
        {
            var retval = new equalityExpression_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken set10 = null;
            IToken set11 = null;
            relationalExpression_return left = null;

            relationalExpression_return right = null;

            CommonTree set10_tree = null;
            CommonTree set11_tree = null;

            var type = BinaryExpressionType.Unknown;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:139:2: (left= relationalExpression ( ( ( '==' | '=' ) | ( '!=' | '<>' ) ) right= relationalExpression )* )
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:139:4: left= relationalExpression ( ( ( '==' | '=' ) | ( '!=' | '<>' ) ) right= relationalExpression )*
                {
                    root_0 = (CommonTree)adaptor.GetNilNode();

                    PushFollow(FOLLOW_relationalExpression_in_equalityExpression394);
                    left = relationalExpression();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, left.Tree);
                    retval.value = left != null ? left.value : null;
                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:139:56: ( ( ( '==' | '=' ) | ( '!=' | '<>' ) ) right= relationalExpression )*
                    do
                    {
                        var alt8 = 2;
                        var LA8_0 = input.LA(1);

                        if (LA8_0 >= 28 && LA8_0 <= 31)
                        {
                            alt8 = 1;
                        }

                        switch (alt8)
                        {
                            case 1:
                                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:140:4: ( ( '==' | '=' ) | ( '!=' | '<>' ) ) right= relationalExpression
                                {
                                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:140:4: ( ( '==' | '=' ) | ( '!=' | '<>' ) )
                                    var alt7 = 2;
                                    var LA7_0 = input.LA(1);

                                    if (LA7_0 >= 28 && LA7_0 <= 29)
                                    {
                                        alt7 = 1;
                                    }
                                    else if (LA7_0 >= 30 && LA7_0 <= 31)
                                    {
                                        alt7 = 2;
                                    }
                                    else
                                    {
                                        var nvae_d7s0 =
                                            new NoViableAltException("", 7, 0, input);

                                        throw nvae_d7s0;
                                    }
                                    switch (alt7)
                                    {
                                        case 1:
                                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:140:6: ( '==' | '=' )
                                            {
                                                set10 = (IToken)input.LT(1);
                                                if (input.LA(1) >= 28 && input.LA(1) <= 29)
                                                {
                                                    input.Consume();
                                                    adaptor.AddChild(root_0, (CommonTree)adaptor.Create(set10));
                                                    state.errorRecovery = false;
                                                }
                                                else
                                                {
                                                    var mse = new MismatchedSetException(null, input);
                                                    throw mse;
                                                }

                                                type = BinaryExpressionType.Equal;
                                            }
                                            break;
                                        case 2:
                                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:141:6: ( '!=' | '<>' )
                                            {
                                                set11 = (IToken)input.LT(1);
                                                if (input.LA(1) >= 30 && input.LA(1) <= 31)
                                                {
                                                    input.Consume();
                                                    adaptor.AddChild(root_0, (CommonTree)adaptor.Create(set11));
                                                    state.errorRecovery = false;
                                                }
                                                else
                                                {
                                                    var mse = new MismatchedSetException(null, input);
                                                    throw mse;
                                                }

                                                type = BinaryExpressionType.NotEqual;
                                            }
                                            break;
                                    }

                                    PushFollow(FOLLOW_relationalExpression_in_equalityExpression441);
                                    right = relationalExpression();
                                    state.followingStackPointer--;

                                    adaptor.AddChild(root_0, right.Tree);
                                    retval.value = new BinaryExpression(type, retval.value, right != null ? right.value : null);
                                }
                                break;

                            default:
                                goto loop8;
                        }
                    }
                    while (true);

                loop8:
                    ; // Stops C# compiler whining that label 'loop8' has no statements
                }

                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "relationalExpression"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:146:1: relationalExpression returns [LogicalExpression value] : left= shiftExpression ( ( '<' | '<=' | '>' | '>=' ) right= shiftExpression )* ;
        public relationalExpression_return relationalExpression() // throws RecognitionException [1]
        {
            var retval = new relationalExpression_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken char_literal12 = null;
            IToken string_literal13 = null;
            IToken char_literal14 = null;
            IToken string_literal15 = null;
            shiftExpression_return left = null;

            shiftExpression_return right = null;

            CommonTree char_literal12_tree = null;
            CommonTree string_literal13_tree = null;
            CommonTree char_literal14_tree = null;
            CommonTree string_literal15_tree = null;

            var type = BinaryExpressionType.Unknown;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:150:2: (left= shiftExpression ( ( '<' | '<=' | '>' | '>=' ) right= shiftExpression )* )
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:150:4: left= shiftExpression ( ( '<' | '<=' | '>' | '>=' ) right= shiftExpression )*
                {
                    root_0 = (CommonTree)adaptor.GetNilNode();

                    PushFollow(FOLLOW_shiftExpression_in_relationalExpression474);
                    left = shiftExpression();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, left.Tree);
                    retval.value = left != null ? left.value : null;
                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:150:51: ( ( '<' | '<=' | '>' | '>=' ) right= shiftExpression )*
                    do
                    {
                        var alt10 = 2;
                        var LA10_0 = input.LA(1);

                        if (LA10_0 >= 32 && LA10_0 <= 35)
                        {
                            alt10 = 1;
                        }

                        switch (alt10)
                        {
                            case 1:
                                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:151:4: ( '<' | '<=' | '>' | '>=' ) right= shiftExpression
                                {
                                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:151:4: ( '<' | '<=' | '>' | '>=' )
                                    var alt9 = 4;
                                    switch (input.LA(1))
                                    {
                                        case 32:
                                            {
                                                alt9 = 1;
                                            }
                                            break;
                                        case 33:
                                            {
                                                alt9 = 2;
                                            }
                                            break;
                                        case 34:
                                            {
                                                alt9 = 3;
                                            }
                                            break;
                                        case 35:
                                            {
                                                alt9 = 4;
                                            }
                                            break;
                                        default:
                                            var nvae_d9s0 =
                                                new NoViableAltException("", 9, 0, input);

                                            throw nvae_d9s0;
                                    }

                                    switch (alt9)
                                    {
                                        case 1:
                                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:151:6: '<'
                                            {
                                                char_literal12 = (IToken)Match(input, 32, FOLLOW_32_in_relationalExpression485);
                                                char_literal12_tree = (CommonTree)adaptor.Create(char_literal12);
                                                adaptor.AddChild(root_0, char_literal12_tree);

                                                type = BinaryExpressionType.Lesser;
                                            }
                                            break;
                                        case 2:
                                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:152:6: '<='
                                            {
                                                string_literal13 = (IToken)Match(input, 33, FOLLOW_33_in_relationalExpression495);
                                                string_literal13_tree = (CommonTree)adaptor.Create(string_literal13);
                                                adaptor.AddChild(root_0, string_literal13_tree);

                                                type = BinaryExpressionType.LesserOrEqual;
                                            }
                                            break;
                                        case 3:
                                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:153:6: '>'
                                            {
                                                char_literal14 = (IToken)Match(input, 34, FOLLOW_34_in_relationalExpression506);
                                                char_literal14_tree = (CommonTree)adaptor.Create(char_literal14);
                                                adaptor.AddChild(root_0, char_literal14_tree);

                                                type = BinaryExpressionType.Greater;
                                            }
                                            break;
                                        case 4:
                                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:154:6: '>='
                                            {
                                                string_literal15 = (IToken)Match(input, 35, FOLLOW_35_in_relationalExpression516);
                                                string_literal15_tree = (CommonTree)adaptor.Create(string_literal15);
                                                adaptor.AddChild(root_0, string_literal15_tree);

                                                type = BinaryExpressionType.GreaterOrEqual;
                                            }
                                            break;
                                    }

                                    PushFollow(FOLLOW_shiftExpression_in_relationalExpression528);
                                    right = shiftExpression();
                                    state.followingStackPointer--;

                                    adaptor.AddChild(root_0, right.Tree);
                                    retval.value = new BinaryExpression(type, retval.value, right != null ? right.value : null);
                                }
                                break;

                            default:
                                goto loop10;
                        }
                    }
                    while (true);

                loop10:
                    ; // Stops C# compiler whining that label 'loop10' has no statements
                }

                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "shiftExpression"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:159:1: shiftExpression returns [LogicalExpression value] : left= additiveExpression ( ( '<<' | '>>' ) right= additiveExpression )* ;
        public shiftExpression_return shiftExpression() // throws RecognitionException [1]
        {
            var retval = new shiftExpression_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken string_literal16 = null;
            IToken string_literal17 = null;
            additiveExpression_return left = null;

            additiveExpression_return right = null;

            CommonTree string_literal16_tree = null;
            CommonTree string_literal17_tree = null;

            var type = BinaryExpressionType.Unknown;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:163:2: (left= additiveExpression ( ( '<<' | '>>' ) right= additiveExpression )* )
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:163:4: left= additiveExpression ( ( '<<' | '>>' ) right= additiveExpression )*
                {
                    root_0 = (CommonTree)adaptor.GetNilNode();

                    PushFollow(FOLLOW_additiveExpression_in_shiftExpression560);
                    left = additiveExpression();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, left.Tree);
                    retval.value = left != null ? left.value : null;
                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:163:54: ( ( '<<' | '>>' ) right= additiveExpression )*
                    do
                    {
                        var alt12 = 2;
                        var LA12_0 = input.LA(1);

                        if (LA12_0 >= 36 && LA12_0 <= 37)
                        {
                            alt12 = 1;
                        }

                        switch (alt12)
                        {
                            case 1:
                                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:164:4: ( '<<' | '>>' ) right= additiveExpression
                                {
                                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:164:4: ( '<<' | '>>' )
                                    var alt11 = 2;
                                    var LA11_0 = input.LA(1);

                                    if (LA11_0 == 36)
                                    {
                                        alt11 = 1;
                                    }
                                    else if (LA11_0 == 37)
                                    {
                                        alt11 = 2;
                                    }
                                    else
                                    {
                                        var nvae_d11s0 =
                                            new NoViableAltException("", 11, 0, input);

                                        throw nvae_d11s0;
                                    }
                                    switch (alt11)
                                    {
                                        case 1:
                                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:164:6: '<<'
                                            {
                                                string_literal16 = (IToken)Match(input, 36, FOLLOW_36_in_shiftExpression571);
                                                string_literal16_tree = (CommonTree)adaptor.Create(string_literal16);
                                                adaptor.AddChild(root_0, string_literal16_tree);

                                                type = BinaryExpressionType.LeftShift;
                                            }
                                            break;
                                        case 2:
                                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:165:6: '>>'
                                            {
                                                string_literal17 = (IToken)Match(input, 37, FOLLOW_37_in_shiftExpression581);
                                                string_literal17_tree = (CommonTree)adaptor.Create(string_literal17);
                                                adaptor.AddChild(root_0, string_literal17_tree);

                                                type = BinaryExpressionType.RightShift;
                                            }
                                            break;
                                    }

                                    PushFollow(FOLLOW_additiveExpression_in_shiftExpression593);
                                    right = additiveExpression();
                                    state.followingStackPointer--;

                                    adaptor.AddChild(root_0, right.Tree);
                                    retval.value = new BinaryExpression(type, retval.value, right != null ? right.value : null);
                                }
                                break;

                            default:
                                goto loop12;
                        }
                    }
                    while (true);

                loop12:
                    ; // Stops C# compiler whining that label 'loop12' has no statements
                }

                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "additiveExpression"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:170:1: additiveExpression returns [LogicalExpression value] : left= multiplicativeExpression ( ( '+' | '-' ) right= multiplicativeExpression )* ;
        public additiveExpression_return additiveExpression() // throws RecognitionException [1]
        {
            var retval = new additiveExpression_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken char_literal18 = null;
            IToken char_literal19 = null;
            multiplicativeExpression_return left = null;

            multiplicativeExpression_return right = null;

            CommonTree char_literal18_tree = null;
            CommonTree char_literal19_tree = null;

            var type = BinaryExpressionType.Unknown;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:174:2: (left= multiplicativeExpression ( ( '+' | '-' ) right= multiplicativeExpression )* )
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:174:4: left= multiplicativeExpression ( ( '+' | '-' ) right= multiplicativeExpression )*
                {
                    root_0 = (CommonTree)adaptor.GetNilNode();

                    PushFollow(FOLLOW_multiplicativeExpression_in_additiveExpression625);
                    left = multiplicativeExpression();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, left.Tree);
                    retval.value = left != null ? left.value : null;
                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:174:60: ( ( '+' | '-' ) right= multiplicativeExpression )*
                    do
                    {
                        var alt14 = 2;
                        var LA14_0 = input.LA(1);

                        if (LA14_0 >= 38 && LA14_0 <= 39)
                        {
                            alt14 = 1;
                        }

                        switch (alt14)
                        {
                            case 1:
                                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:175:4: ( '+' | '-' ) right= multiplicativeExpression
                                {
                                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:175:4: ( '+' | '-' )
                                    var alt13 = 2;
                                    var LA13_0 = input.LA(1);

                                    if (LA13_0 == 38)
                                    {
                                        alt13 = 1;
                                    }
                                    else if (LA13_0 == 39)
                                    {
                                        alt13 = 2;
                                    }
                                    else
                                    {
                                        var nvae_d13s0 =
                                            new NoViableAltException("", 13, 0, input);

                                        throw nvae_d13s0;
                                    }
                                    switch (alt13)
                                    {
                                        case 1:
                                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:175:6: '+'
                                            {
                                                char_literal18 = (IToken)Match(input, 38, FOLLOW_38_in_additiveExpression636);
                                                char_literal18_tree = (CommonTree)adaptor.Create(char_literal18);
                                                adaptor.AddChild(root_0, char_literal18_tree);

                                                type = BinaryExpressionType.Plus;
                                            }
                                            break;
                                        case 2:
                                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:176:6: '-'
                                            {
                                                char_literal19 = (IToken)Match(input, 39, FOLLOW_39_in_additiveExpression646);
                                                char_literal19_tree = (CommonTree)adaptor.Create(char_literal19);
                                                adaptor.AddChild(root_0, char_literal19_tree);

                                                type = BinaryExpressionType.Minus;
                                            }
                                            break;
                                    }

                                    PushFollow(FOLLOW_multiplicativeExpression_in_additiveExpression658);
                                    right = multiplicativeExpression();
                                    state.followingStackPointer--;

                                    adaptor.AddChild(root_0, right.Tree);
                                    retval.value = new BinaryExpression(type, retval.value, right != null ? right.value : null);
                                }
                                break;

                            default:
                                goto loop14;
                        }
                    }
                    while (true);

                loop14:
                    ; // Stops C# compiler whining that label 'loop14' has no statements
                }

                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "multiplicativeExpression"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:181:1: multiplicativeExpression returns [LogicalExpression value] : left= unaryExpression ( ( '*' | '/' | '%' ) right= unaryExpression )* ;
        public multiplicativeExpression_return multiplicativeExpression() // throws RecognitionException [1]
        {
            var retval = new multiplicativeExpression_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken char_literal20 = null;
            IToken char_literal21 = null;
            IToken char_literal22 = null;
            unaryExpression_return left = null;

            unaryExpression_return right = null;

            CommonTree char_literal20_tree = null;
            CommonTree char_literal21_tree = null;
            CommonTree char_literal22_tree = null;

            var type = BinaryExpressionType.Unknown;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:185:2: (left= unaryExpression ( ( '*' | '/' | '%' ) right= unaryExpression )* )
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:185:4: left= unaryExpression ( ( '*' | '/' | '%' ) right= unaryExpression )*
                {
                    root_0 = (CommonTree)adaptor.GetNilNode();

                    PushFollow(FOLLOW_unaryExpression_in_multiplicativeExpression690);
                    left = unaryExpression();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, left.Tree);
                    retval.value = left != null ? left.value : null;
                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:185:52: ( ( '*' | '/' | '%' ) right= unaryExpression )*
                    do
                    {
                        var alt16 = 2;
                        var LA16_0 = input.LA(1);

                        if (LA16_0 >= 40 && LA16_0 <= 42)
                        {
                            alt16 = 1;
                        }

                        switch (alt16)
                        {
                            case 1:
                                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:186:4: ( '*' | '/' | '%' ) right= unaryExpression
                                {
                                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:186:4: ( '*' | '/' | '%' )
                                    var alt15 = 3;
                                    switch (input.LA(1))
                                    {
                                        case 40:
                                            {
                                                alt15 = 1;
                                            }
                                            break;
                                        case 41:
                                            {
                                                alt15 = 2;
                                            }
                                            break;
                                        case 42:
                                            {
                                                alt15 = 3;
                                            }
                                            break;
                                        default:
                                            var nvae_d15s0 =
                                                new NoViableAltException("", 15, 0, input);

                                            throw nvae_d15s0;
                                    }

                                    switch (alt15)
                                    {
                                        case 1:
                                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:186:6: '*'
                                            {
                                                char_literal20 = (IToken)Match(input, 40, FOLLOW_40_in_multiplicativeExpression701);
                                                char_literal20_tree = (CommonTree)adaptor.Create(char_literal20);
                                                adaptor.AddChild(root_0, char_literal20_tree);

                                                type = BinaryExpressionType.Times;
                                            }
                                            break;
                                        case 2:
                                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:187:6: '/'
                                            {
                                                char_literal21 = (IToken)Match(input, 41, FOLLOW_41_in_multiplicativeExpression711);
                                                char_literal21_tree = (CommonTree)adaptor.Create(char_literal21);
                                                adaptor.AddChild(root_0, char_literal21_tree);

                                                type = BinaryExpressionType.Div;
                                            }
                                            break;
                                        case 3:
                                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:188:6: '%'
                                            {
                                                char_literal22 = (IToken)Match(input, 42, FOLLOW_42_in_multiplicativeExpression721);
                                                char_literal22_tree = (CommonTree)adaptor.Create(char_literal22);
                                                adaptor.AddChild(root_0, char_literal22_tree);

                                                type = BinaryExpressionType.Modulo;
                                            }
                                            break;
                                    }

                                    PushFollow(FOLLOW_unaryExpression_in_multiplicativeExpression733);
                                    right = unaryExpression();
                                    state.followingStackPointer--;

                                    adaptor.AddChild(root_0, right.Tree);
                                    retval.value = new BinaryExpression(type, retval.value, right != null ? right.value : null);
                                }
                                break;

                            default:
                                goto loop16;
                        }
                    }
                    while (true);

                loop16:
                    ; // Stops C# compiler whining that label 'loop16' has no statements
                }

                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "unaryExpression"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:194:1: unaryExpression returns [LogicalExpression value] : ( primaryExpression | ( '!' | 'not' ) primaryExpression | ( '~' ) primaryExpression | '-' primaryExpression );
        public unaryExpression_return unaryExpression() // throws RecognitionException [1]
        {
            var retval = new unaryExpression_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken set24 = null;
            IToken char_literal26 = null;
            IToken char_literal28 = null;
            primaryExpression_return primaryExpression23 = null;

            primaryExpression_return primaryExpression25 = null;

            primaryExpression_return primaryExpression27 = null;

            primaryExpression_return primaryExpression29 = null;

            CommonTree set24_tree = null;
            CommonTree char_literal26_tree = null;
            CommonTree char_literal28_tree = null;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:195:2: ( primaryExpression | ( '!' | 'not' ) primaryExpression | ( '~' ) primaryExpression | '-' primaryExpression )
                var alt17 = 4;
                switch (input.LA(1))
                {
                    case INTEGER:
                    case FLOAT:
                    case STRING:
                    case DATETIME:
                    case TRUE:
                    case FALSE:
                    case ID:
                    case NAME:
                    case 46:
                        {
                            alt17 = 1;
                        }
                        break;
                    case 43:
                    case 44:
                        {
                            alt17 = 2;
                        }
                        break;
                    case 45:
                        {
                            alt17 = 3;
                        }
                        break;
                    case 39:
                        {
                            alt17 = 4;
                        }
                        break;
                    default:
                        var nvae_d17s0 =
                            new NoViableAltException("", 17, 0, input);

                        throw nvae_d17s0;
                }

                switch (alt17)
                {
                    case 1:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:195:4: primaryExpression
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            PushFollow(FOLLOW_primaryExpression_in_unaryExpression760);
                            primaryExpression23 = primaryExpression();
                            state.followingStackPointer--;

                            adaptor.AddChild(root_0, primaryExpression23.Tree);
                            retval.value = primaryExpression23 != null ? primaryExpression23.value : null;
                        }
                        break;
                    case 2:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:196:8: ( '!' | 'not' ) primaryExpression
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            set24 = (IToken)input.LT(1);
                            if (input.LA(1) >= 43 && input.LA(1) <= 44)
                            {
                                input.Consume();
                                adaptor.AddChild(root_0, (CommonTree)adaptor.Create(set24));
                                state.errorRecovery = false;
                            }
                            else
                            {
                                var mse = new MismatchedSetException(null, input);
                                throw mse;
                            }

                            PushFollow(FOLLOW_primaryExpression_in_unaryExpression779);
                            primaryExpression25 = primaryExpression();
                            state.followingStackPointer--;

                            adaptor.AddChild(root_0, primaryExpression25.Tree);
                            retval.value = new UnaryExpression(UnaryExpressionType.Not, primaryExpression25 != null ? primaryExpression25.value : null);
                        }
                        break;
                    case 3:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:197:8: ( '~' ) primaryExpression
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:197:8: ( '~' )
                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:197:9: '~'
                            {
                                char_literal26 = (IToken)Match(input, 45, FOLLOW_45_in_unaryExpression791);
                                char_literal26_tree = (CommonTree)adaptor.Create(char_literal26);
                                adaptor.AddChild(root_0, char_literal26_tree);
                            }

                            PushFollow(FOLLOW_primaryExpression_in_unaryExpression794);
                            primaryExpression27 = primaryExpression();
                            state.followingStackPointer--;

                            adaptor.AddChild(root_0, primaryExpression27.Tree);
                            retval.value = new UnaryExpression(UnaryExpressionType.BitwiseNot, primaryExpression27 != null ? primaryExpression27.value : null);
                        }
                        break;
                    case 4:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:198:8: '-' primaryExpression
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            char_literal28 = (IToken)Match(input, 39, FOLLOW_39_in_unaryExpression805);
                            char_literal28_tree = (CommonTree)adaptor.Create(char_literal28);
                            adaptor.AddChild(root_0, char_literal28_tree);

                            PushFollow(FOLLOW_primaryExpression_in_unaryExpression807);
                            primaryExpression29 = primaryExpression();
                            state.followingStackPointer--;

                            adaptor.AddChild(root_0, primaryExpression29.Tree);
                            retval.value = new UnaryExpression(UnaryExpressionType.Negate, primaryExpression29 != null ? primaryExpression29.value : null);
                        }
                        break;
                }
                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "primaryExpression"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:201:1: primaryExpression returns [LogicalExpression value] : ( '(' logicalExpression ')' | expr= value | identifier ( arguments )? );
        public primaryExpression_return primaryExpression() // throws RecognitionException [1]
        {
            var retval = new primaryExpression_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken char_literal30 = null;
            IToken char_literal32 = null;
            value_return expr = null;

            logicalExpression_return logicalExpression31 = null;

            identifier_return identifier33 = null;

            arguments_return arguments34 = null;

            CommonTree char_literal30_tree = null;
            CommonTree char_literal32_tree = null;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:202:2: ( '(' logicalExpression ')' | expr= value | identifier ( arguments )? )
                var alt19 = 3;
                switch (input.LA(1))
                {
                    case 46:
                        {
                            alt19 = 1;
                        }
                        break;
                    case INTEGER:
                    case FLOAT:
                    case STRING:
                    case DATETIME:
                    case TRUE:
                    case FALSE:
                        {
                            alt19 = 2;
                        }
                        break;
                    case ID:
                    case NAME:
                        {
                            alt19 = 3;
                        }
                        break;
                    default:
                        var nvae_d19s0 =
                            new NoViableAltException("", 19, 0, input);

                        throw nvae_d19s0;
                }

                switch (alt19)
                {
                    case 1:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:202:4: '(' logicalExpression ')'
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            char_literal30 = (IToken)Match(input, 46, FOLLOW_46_in_primaryExpression829);
                            char_literal30_tree = (CommonTree)adaptor.Create(char_literal30);
                            adaptor.AddChild(root_0, char_literal30_tree);

                            PushFollow(FOLLOW_logicalExpression_in_primaryExpression831);
                            logicalExpression31 = logicalExpression();
                            state.followingStackPointer--;

                            adaptor.AddChild(root_0, logicalExpression31.Tree);
                            char_literal32 = (IToken)Match(input, 47, FOLLOW_47_in_primaryExpression833);
                            char_literal32_tree = (CommonTree)adaptor.Create(char_literal32);
                            adaptor.AddChild(root_0, char_literal32_tree);

                            retval.value = logicalExpression31 != null ? logicalExpression31.value : null;
                        }
                        break;
                    case 2:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:203:4: expr= value
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            PushFollow(FOLLOW_value_in_primaryExpression843);
                            expr = value();
                            state.followingStackPointer--;

                            adaptor.AddChild(root_0, expr.Tree);
                            retval.value = expr != null ? expr.value : null;
                        }
                        break;
                    case 3:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:204:4: identifier ( arguments )?
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            PushFollow(FOLLOW_identifier_in_primaryExpression851);
                            identifier33 = identifier();
                            state.followingStackPointer--;

                            adaptor.AddChild(root_0, identifier33.Tree);
                            retval.value = (LogicalExpression)(identifier33 != null ? identifier33.value : null);
                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:204:66: ( arguments )?
                            var alt18 = 2;
                            var LA18_0 = input.LA(1);

                            if (LA18_0 == 46)
                            {
                                alt18 = 1;
                            }
                            switch (alt18)
                            {
                                case 1:
                                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:204:67: arguments
                                    {
                                        PushFollow(FOLLOW_arguments_in_primaryExpression856);
                                        arguments34 = arguments();
                                        state.followingStackPointer--;

                                        adaptor.AddChild(root_0, arguments34.Tree);
                                        retval.value = new FunctionExpression(identifier33 != null ? identifier33.value : null, (arguments34 != null ? arguments34.value : null).ToArray());
                                    }
                                    break;
                            }
                        }
                        break;
                }
                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "value"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:207:1: value returns [ValueExpression value] : ( INTEGER | FLOAT | STRING | DATETIME | TRUE | FALSE );
        public value_return value() // throws RecognitionException [1]
        {
            var retval = new value_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken INTEGER35 = null;
            IToken FLOAT36 = null;
            IToken STRING37 = null;
            IToken DATETIME38 = null;
            IToken TRUE39 = null;
            IToken FALSE40 = null;

            CommonTree INTEGER35_tree = null;
            CommonTree FLOAT36_tree = null;
            CommonTree STRING37_tree = null;
            CommonTree DATETIME38_tree = null;
            CommonTree TRUE39_tree = null;
            CommonTree FALSE40_tree = null;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:208:2: ( INTEGER | FLOAT | STRING | DATETIME | TRUE | FALSE )
                var alt20 = 6;
                switch (input.LA(1))
                {
                    case INTEGER:
                        {
                            alt20 = 1;
                        }
                        break;
                    case FLOAT:
                        {
                            alt20 = 2;
                        }
                        break;
                    case STRING:
                        {
                            alt20 = 3;
                        }
                        break;
                    case DATETIME:
                        {
                            alt20 = 4;
                        }
                        break;
                    case TRUE:
                        {
                            alt20 = 5;
                        }
                        break;
                    case FALSE:
                        {
                            alt20 = 6;
                        }
                        break;
                    default:
                        var nvae_d20s0 =
                            new NoViableAltException("", 20, 0, input);

                        throw nvae_d20s0;
                }

                switch (alt20)
                {
                    case 1:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:208:5: INTEGER
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            INTEGER35 = (IToken)Match(input, INTEGER, FOLLOW_INTEGER_in_value876);
                            INTEGER35_tree = (CommonTree)adaptor.Create(INTEGER35);
                            adaptor.AddChild(root_0, INTEGER35_tree);

                            try
                            {
                                retval.value = new ValueExpression(int.Parse(INTEGER35 != null ? INTEGER35.Text : null));
                            }
                            catch (OverflowException)
                            {
                                retval.value = new ValueExpression(long.Parse(INTEGER35 != null ? INTEGER35.Text : null));
                            }
                        }
                        break;
                    case 2:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:209:4: FLOAT
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            FLOAT36 = (IToken)Match(input, FLOAT, FOLLOW_FLOAT_in_value884);
                            FLOAT36_tree = (CommonTree)adaptor.Create(FLOAT36);
                            adaptor.AddChild(root_0, FLOAT36_tree);

                            retval.value = new ValueExpression(double.Parse(FLOAT36 != null ? FLOAT36.Text : null, NumberStyles.Float, numberFormatInfo));
                        }
                        break;
                    case 3:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:210:4: STRING
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            STRING37 = (IToken)Match(input, STRING, FOLLOW_STRING_in_value892);
                            STRING37_tree = (CommonTree)adaptor.Create(STRING37);
                            adaptor.AddChild(root_0, STRING37_tree);

                            retval.value = new ValueExpression(extractString(STRING37 != null ? STRING37.Text : null));
                        }
                        break;
                    case 4:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:211:5: DATETIME
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            DATETIME38 = (IToken)Match(input, DATETIME, FOLLOW_DATETIME_in_value901);
                            DATETIME38_tree = (CommonTree)adaptor.Create(DATETIME38);
                            adaptor.AddChild(root_0, DATETIME38_tree);

                            retval.value = new ValueExpression(DateTime.Parse((DATETIME38 != null ? DATETIME38.Text : null).Substring(1, (DATETIME38 != null ? DATETIME38.Text : null).Length - 2)));
                        }
                        break;
                    case 5:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:212:4: TRUE
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            TRUE39 = (IToken)Match(input, TRUE, FOLLOW_TRUE_in_value908);
                            TRUE39_tree = (CommonTree)adaptor.Create(TRUE39);
                            adaptor.AddChild(root_0, TRUE39_tree);

                            retval.value = new ValueExpression(true);
                        }
                        break;
                    case 6:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:213:4: FALSE
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            FALSE40 = (IToken)Match(input, FALSE, FOLLOW_FALSE_in_value916);
                            FALSE40_tree = (CommonTree)adaptor.Create(FALSE40);
                            adaptor.AddChild(root_0, FALSE40_tree);

                            retval.value = new ValueExpression(false);
                        }
                        break;
                }
                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "identifier"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:216:1: identifier returns [Identifier value] : ( ID | NAME );
        public identifier_return identifier() // throws RecognitionException [1]
        {
            var retval = new identifier_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken ID41 = null;
            IToken NAME42 = null;

            CommonTree ID41_tree = null;
            CommonTree NAME42_tree = null;

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:217:2: ( ID | NAME )
                var alt21 = 2;
                var LA21_0 = input.LA(1);

                if (LA21_0 == ID)
                {
                    alt21 = 1;
                }
                else if (LA21_0 == NAME)
                {
                    alt21 = 2;
                }
                else
                {
                    var nvae_d21s0 =
                        new NoViableAltException("", 21, 0, input);

                    throw nvae_d21s0;
                }
                switch (alt21)
                {
                    case 1:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:217:5: ID
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            ID41 = (IToken)Match(input, ID, FOLLOW_ID_in_identifier934);
                            ID41_tree = (CommonTree)adaptor.Create(ID41);
                            adaptor.AddChild(root_0, ID41_tree);

                            retval.value = new IdentifierExpression(ID41 != null ? ID41.Text : null);
                        }
                        break;
                    case 2:
                        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:218:5: NAME
                        {
                            root_0 = (CommonTree)adaptor.GetNilNode();

                            NAME42 = (IToken)Match(input, NAME, FOLLOW_NAME_in_identifier942);
                            NAME42_tree = (CommonTree)adaptor.Create(NAME42);
                            adaptor.AddChild(root_0, NAME42_tree);

                            retval.value = new IdentifierExpression((NAME42 != null ? NAME42.Text : null).Substring(1, (NAME42 != null ? NAME42.Text : null).Length - 2));
                        }
                        break;
                }
                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "expressionList"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:221:1: expressionList returns [List<LogicalExpression> value] : first= logicalExpression ( ',' follow= logicalExpression )* ;
        public expressionList_return expressionList() // throws RecognitionException [1]
        {
            var retval = new expressionList_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken char_literal43 = null;
            logicalExpression_return first = null;

            logicalExpression_return follow = null;

            CommonTree char_literal43_tree = null;

            var expressions = new List<LogicalExpression>();

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:225:2: (first= logicalExpression ( ',' follow= logicalExpression )* )
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:225:4: first= logicalExpression ( ',' follow= logicalExpression )*
                {
                    root_0 = (CommonTree)adaptor.GetNilNode();

                    PushFollow(FOLLOW_logicalExpression_in_expressionList966);
                    first = logicalExpression();
                    state.followingStackPointer--;

                    adaptor.AddChild(root_0, first.Tree);
                    expressions.Add(first != null ? first.value : null);
                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:225:62: ( ',' follow= logicalExpression )*
                    do
                    {
                        var alt22 = 2;
                        var LA22_0 = input.LA(1);

                        if (LA22_0 == 48)
                        {
                            alt22 = 1;
                        }

                        switch (alt22)
                        {
                            case 1:
                                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:225:64: ',' follow= logicalExpression
                                {
                                    char_literal43 = (IToken)Match(input, 48, FOLLOW_48_in_expressionList973);
                                    char_literal43_tree = (CommonTree)adaptor.Create(char_literal43);
                                    adaptor.AddChild(root_0, char_literal43_tree);

                                    PushFollow(FOLLOW_logicalExpression_in_expressionList977);
                                    follow = logicalExpression();
                                    state.followingStackPointer--;

                                    adaptor.AddChild(root_0, follow.Tree);
                                    expressions.Add(follow != null ? follow.value : null);
                                }
                                break;

                            default:
                                goto loop22;
                        }
                    }
                    while (true);

                loop22:
                    ; // Stops C# compiler whining that label 'loop22' has no statements

                    retval.value = expressions;
                }

                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        // $ANTLR start "arguments"
        // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:229:1: arguments returns [List<LogicalExpression> value] : '(' ( expressionList )? ')' ;
        public arguments_return arguments() // throws RecognitionException [1]
        {
            var retval = new arguments_return();
            retval.Start = input.LT(1);

            CommonTree root_0 = null;

            IToken char_literal44 = null;
            IToken char_literal46 = null;
            expressionList_return expressionList45 = null;

            CommonTree char_literal44_tree = null;
            CommonTree char_literal46_tree = null;

            retval.value = new List<LogicalExpression>();

            try
            {
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:233:2: ( '(' ( expressionList )? ')' )
                // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:233:4: '(' ( expressionList )? ')'
                {
                    root_0 = (CommonTree)adaptor.GetNilNode();

                    char_literal44 = (IToken)Match(input, 46, FOLLOW_46_in_arguments1006);
                    char_literal44_tree = (CommonTree)adaptor.Create(char_literal44);
                    adaptor.AddChild(root_0, char_literal44_tree);

                    // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:233:8: ( expressionList )?
                    var alt23 = 2;
                    var LA23_0 = input.LA(1);

                    if (LA23_0 >= INTEGER && LA23_0 <= NAME || LA23_0 == 39 || LA23_0 >= 43 && LA23_0 <= 46)
                    {
                        alt23 = 1;
                    }
                    switch (alt23)
                    {
                        case 1:
                            // C:\\Users\\s.ros\\Documents\\D�veloppement\\NCalc\\Grammar\\NCalc.g:233:10: expressionList
                            {
                                PushFollow(FOLLOW_expressionList_in_arguments1010);
                                expressionList45 = expressionList();
                                state.followingStackPointer--;

                                adaptor.AddChild(root_0, expressionList45.Tree);
                                retval.value = expressionList45 != null ? expressionList45.value : null;
                            }
                            break;
                    }

                    char_literal46 = (IToken)Match(input, 47, FOLLOW_47_in_arguments1017);
                    char_literal46_tree = (CommonTree)adaptor.Create(char_literal46);
                    adaptor.AddChild(root_0, char_literal46_tree);
                }

                retval.Stop = input.LT(-1);

                retval.Tree = (CommonTree)adaptor.RulePostProcessing(root_0);
                adaptor.SetTokenBoundaries(retval.Tree, (IToken)retval.Start, (IToken)retval.Stop);
            }
            catch (RecognitionException re)
            {
                ReportError(re);
                Recover(input, re);
                // Conversion of the second argument necessary, but harmless
                retval.Tree = (CommonTree)adaptor.ErrorNode(input, (IToken)retval.Start, input.LT(-1), re);
            }
            finally { }
            return retval;
        }

        public const int T__29 = 29;
        public const int T__28 = 28;
        public const int T__27 = 27;
        public const int T__26 = 26;
        public const int T__25 = 25;
        public const int T__24 = 24;
        public const int T__23 = 23;
        public const int LETTER = 12;
        public const int T__22 = 22;
        public const int T__21 = 21;
        public const int T__20 = 20;
        public const int FLOAT = 5;
        public const int ID = 10;
        public const int EOF = -1;
        public const int HexDigit = 17;
        public const int T__19 = 19;
        public const int NAME = 11;
        public const int DIGIT = 13;
        public const int T__42 = 42;
        public const int INTEGER = 4;
        public const int E = 14;
        public const int T__43 = 43;
        public const int T__40 = 40;
        public const int T__41 = 41;
        public const int T__46 = 46;
        public const int T__47 = 47;
        public const int T__44 = 44;
        public const int T__45 = 45;
        public const int T__48 = 48;
        public const int DATETIME = 7;
        public const int TRUE = 8;
        public const int T__30 = 30;
        public const int T__31 = 31;
        public const int T__32 = 32;
        public const int WS = 18;
        public const int T__33 = 33;
        public const int T__34 = 34;
        public const int T__35 = 35;
        public const int T__36 = 36;
        public const int T__37 = 37;
        public const int T__38 = 38;
        public const int T__39 = 39;
        public const int UnicodeEscape = 16;
        public const int FALSE = 9;
        public const int EscapeSequence = 15;
        public const int STRING = 6;

        private const char BS = '\\';

        public static readonly string[] tokenNames = new[]
        {
            "<invalid>",
            "<EOR>",
            "<DOWN>",
            "<UP>",
            "INTEGER",
            "FLOAT",
            "STRING",
            "DATETIME",
            "TRUE",
            "FALSE",
            "ID",
            "NAME",
            "LETTER",
            "DIGIT",
            "E",
            "EscapeSequence",
            "UnicodeEscape",
            "HexDigit",
            "WS",
            "'?'",
            "':'",
            "'||'",
            "'or'",
            "'&&'",
            "'and'",
            "'|'",
            "'^'",
            "'&'",
            "'=='",
            "'='",
            "'!='",
            "'<>'",
            "'<'",
            "'<='",
            "'>'",
            "'>='",
            "'<<'",
            "'>>'",
            "'+'",
            "'-'",
            "'*'",
            "'/'",
            "'%'",
            "'!'",
            "'not'",
            "'~'",
            "'('",
            "')'",
            "','"
        };

        private static NumberFormatInfo numberFormatInfo = new NumberFormatInfo();

        public static readonly BitSet FOLLOW_logicalExpression_in_ncalcExpression56 = new BitSet(new[] { 0x0000000000000000UL });
        public static readonly BitSet FOLLOW_EOF_in_ncalcExpression58 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_conditionalExpression_in_logicalExpression78 = new BitSet(new[] { 0x0000000000080002UL });
        public static readonly BitSet FOLLOW_19_in_logicalExpression84 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_conditionalExpression_in_logicalExpression88 = new BitSet(new[] { 0x0000000000100000UL });
        public static readonly BitSet FOLLOW_20_in_logicalExpression90 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_conditionalExpression_in_logicalExpression94 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_booleanAndExpression_in_conditionalExpression121 = new BitSet(new[] { 0x0000000000600002UL });
        public static readonly BitSet FOLLOW_set_in_conditionalExpression130 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_conditionalExpression_in_conditionalExpression146 = new BitSet(new[] { 0x0000000000600002UL });
        public static readonly BitSet FOLLOW_bitwiseOrExpression_in_booleanAndExpression180 = new BitSet(new[] { 0x0000000001800002UL });
        public static readonly BitSet FOLLOW_set_in_booleanAndExpression189 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_bitwiseOrExpression_in_booleanAndExpression205 = new BitSet(new[] { 0x0000000001800002UL });
        public static readonly BitSet FOLLOW_bitwiseXOrExpression_in_bitwiseOrExpression237 = new BitSet(new[] { 0x0000000002000002UL });
        public static readonly BitSet FOLLOW_25_in_bitwiseOrExpression246 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_bitwiseOrExpression_in_bitwiseOrExpression256 = new BitSet(new[] { 0x0000000002000002UL });
        public static readonly BitSet FOLLOW_bitwiseAndExpression_in_bitwiseXOrExpression290 = new BitSet(new[] { 0x0000000004000002UL });
        public static readonly BitSet FOLLOW_26_in_bitwiseXOrExpression299 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_bitwiseAndExpression_in_bitwiseXOrExpression309 = new BitSet(new[] { 0x0000000004000002UL });
        public static readonly BitSet FOLLOW_equalityExpression_in_bitwiseAndExpression341 = new BitSet(new[] { 0x0000000008000002UL });
        public static readonly BitSet FOLLOW_27_in_bitwiseAndExpression350 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_equalityExpression_in_bitwiseAndExpression360 = new BitSet(new[] { 0x0000000008000002UL });
        public static readonly BitSet FOLLOW_relationalExpression_in_equalityExpression394 = new BitSet(new[] { 0x00000000F0000002UL });
        public static readonly BitSet FOLLOW_set_in_equalityExpression405 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_set_in_equalityExpression422 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_relationalExpression_in_equalityExpression441 = new BitSet(new[] { 0x00000000F0000002UL });
        public static readonly BitSet FOLLOW_shiftExpression_in_relationalExpression474 = new BitSet(new[] { 0x0000000F00000002UL });
        public static readonly BitSet FOLLOW_32_in_relationalExpression485 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_33_in_relationalExpression495 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_34_in_relationalExpression506 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_35_in_relationalExpression516 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_shiftExpression_in_relationalExpression528 = new BitSet(new[] { 0x0000000F00000002UL });
        public static readonly BitSet FOLLOW_additiveExpression_in_shiftExpression560 = new BitSet(new[] { 0x0000003000000002UL });
        public static readonly BitSet FOLLOW_36_in_shiftExpression571 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_37_in_shiftExpression581 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_additiveExpression_in_shiftExpression593 = new BitSet(new[] { 0x0000003000000002UL });
        public static readonly BitSet FOLLOW_multiplicativeExpression_in_additiveExpression625 = new BitSet(new[] { 0x000000C000000002UL });
        public static readonly BitSet FOLLOW_38_in_additiveExpression636 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_39_in_additiveExpression646 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_multiplicativeExpression_in_additiveExpression658 = new BitSet(new[] { 0x000000C000000002UL });
        public static readonly BitSet FOLLOW_unaryExpression_in_multiplicativeExpression690 = new BitSet(new[] { 0x0000070000000002UL });
        public static readonly BitSet FOLLOW_40_in_multiplicativeExpression701 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_41_in_multiplicativeExpression711 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_42_in_multiplicativeExpression721 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_unaryExpression_in_multiplicativeExpression733 = new BitSet(new[] { 0x0000070000000002UL });
        public static readonly BitSet FOLLOW_primaryExpression_in_unaryExpression760 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_set_in_unaryExpression771 = new BitSet(new[] { 0x0000400000000FF0UL });
        public static readonly BitSet FOLLOW_primaryExpression_in_unaryExpression779 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_45_in_unaryExpression791 = new BitSet(new[] { 0x0000400000000FF0UL });
        public static readonly BitSet FOLLOW_primaryExpression_in_unaryExpression794 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_39_in_unaryExpression805 = new BitSet(new[] { 0x0000400000000FF0UL });
        public static readonly BitSet FOLLOW_primaryExpression_in_unaryExpression807 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_46_in_primaryExpression829 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_logicalExpression_in_primaryExpression831 = new BitSet(new[] { 0x0000800000000000UL });
        public static readonly BitSet FOLLOW_47_in_primaryExpression833 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_value_in_primaryExpression843 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_identifier_in_primaryExpression851 = new BitSet(new[] { 0x0000400000000002UL });
        public static readonly BitSet FOLLOW_arguments_in_primaryExpression856 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_INTEGER_in_value876 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_FLOAT_in_value884 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_STRING_in_value892 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_DATETIME_in_value901 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_TRUE_in_value908 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_FALSE_in_value916 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_ID_in_identifier934 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_NAME_in_identifier942 = new BitSet(new[] { 0x0000000000000002UL });
        public static readonly BitSet FOLLOW_logicalExpression_in_expressionList966 = new BitSet(new[] { 0x0001000000000002UL });
        public static readonly BitSet FOLLOW_48_in_expressionList973 = new BitSet(new[] { 0x0000788000000FF0UL });
        public static readonly BitSet FOLLOW_logicalExpression_in_expressionList977 = new BitSet(new[] { 0x0001000000000002UL });
        public static readonly BitSet FOLLOW_46_in_arguments1006 = new BitSet(new[] { 0x0000F88000000FF0UL });
        public static readonly BitSet FOLLOW_expressionList_in_arguments1010 = new BitSet(new[] { 0x0000800000000000UL });
        public static readonly BitSet FOLLOW_47_in_arguments1017 = new BitSet(new[] { 0x0000000000000002UL });

        public class ncalcExpression_return : ParserRuleReturnScope
        {
            public LogicalExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "ncalcExpression"

        public class logicalExpression_return : ParserRuleReturnScope
        {
            public LogicalExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "logicalExpression"

        public class conditionalExpression_return : ParserRuleReturnScope
        {
            public LogicalExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "conditionalExpression"

        public class booleanAndExpression_return : ParserRuleReturnScope
        {
            public LogicalExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "booleanAndExpression"

        public class bitwiseOrExpression_return : ParserRuleReturnScope
        {
            public LogicalExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "bitwiseOrExpression"

        public class bitwiseXOrExpression_return : ParserRuleReturnScope
        {
            public LogicalExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "bitwiseXOrExpression"

        public class bitwiseAndExpression_return : ParserRuleReturnScope
        {
            public LogicalExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "bitwiseAndExpression"

        public class equalityExpression_return : ParserRuleReturnScope
        {
            public LogicalExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "equalityExpression"

        public class relationalExpression_return : ParserRuleReturnScope
        {
            public LogicalExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "relationalExpression"

        public class shiftExpression_return : ParserRuleReturnScope
        {
            public LogicalExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "shiftExpression"

        public class additiveExpression_return : ParserRuleReturnScope
        {
            public LogicalExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "additiveExpression"

        public class multiplicativeExpression_return : ParserRuleReturnScope
        {
            public LogicalExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "multiplicativeExpression"

        public class unaryExpression_return : ParserRuleReturnScope
        {
            public LogicalExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "unaryExpression"

        public class primaryExpression_return : ParserRuleReturnScope
        {
            public LogicalExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "primaryExpression"

        public class value_return : ParserRuleReturnScope
        {
            public ValueExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "value"

        public class identifier_return : ParserRuleReturnScope
        {
            public IdentifierExpression value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "identifier"

        public class expressionList_return : ParserRuleReturnScope
        {
            public List<LogicalExpression> value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };

        // $ANTLR end "expressionList"

        public class arguments_return : ParserRuleReturnScope
        {
            public List<LogicalExpression> value;
            private CommonTree tree;

            override public object Tree
            {
                get
                {
                    return tree;
                }
                set
                {
                    tree = (CommonTree)value;
                }
            }
        };
    }
}