Exemple #1
0
        /// <summary>
        /// expression → terme  [opérateur-additif  terme]*
        /// </summary>
        static double ComputeExpression(StringTokenizer t)
        {
            var expr = ComputeTerm(t);

            while (t.CurrentToken == TokenType.Plus ||
                   t.CurrentToken == TokenType.Minus)
            {
                if (t.Match(TokenType.Plus))
                {
                    expr += ComputeTerm(t);
                }
                if (t.Match(TokenType.Minus))
                {
                    expr -= ComputeTerm(t);
                }
            }
            return(expr);

            //
            // expression → terme | terme opérateur-additif terme
            // ==> only ONE primary/root addition/substraction is handled here!
            //
            //var expr = ComputeTerm( t );
            //if( t.Match( TokenType.Plus ) ) expr += ComputeTerm( t );
            //else if( t.Match( TokenType.Minus ) ) expr -= ComputeTerm( t );
            //return expr;
        }
Exemple #2
0
        /// <summary>
        /// condExpression → expression [? condExpression : condExpression]
        /// </summary>
        static double ComputeCondExpression(StringTokenizer t)
        {
            var expr = ComputeExpression(t);

            if (t.Match(TokenType.QuestionMark))
            {
                var then = ComputeCondExpression(t);
                if (!t.Match(TokenType.Colon))
                {
                    throw new Exception("Expected : of ternary operator.");
                }
                var @else = ComputeCondExpression(t);
                expr = expr > 0 ? then : @else;
            }
            return(expr);
        }
Exemple #3
0
 /// <summary>
 /// positiveFacteur → nombre  |  ‘(’  expression  ‘)’
 /// </summary>
 static double ComputePositiveFactor(StringTokenizer t)
 {
     if (!t.MatchDouble(out var f))
     {
         if (!t.Match(TokenType.OpenPar))
         {
             throw new Exception("Expected number or (.");
         }
         f = ComputeExpression(t);
         if (!t.Match(TokenType.ClosePar))
         {
             throw new Exception("Expected ).");
         }
     }
     return(f);
 }
        Node ParseCondExpression(StringTokenizer t)
        {
            var condition = ParseExpression(t);

            if (t.Match(TokenType.QuestionMark))
            {
                var then = ParseCondExpression(t);
                if (!t.Match(TokenType.Colon))
                {
                    return(new ErrorNode("Expected : of ternary operator."));
                }
                var @else = ParseCondExpression(t);
                condition = new IfNode(condition, then, @else);
            }
            return(condition);
        }
Exemple #5
0
 /// <summary>
 /// facteur ==> PositiveFacteur | '-' PositiveFacteur
 /// </summary>
 static double ComputeFactor(StringTokenizer t)
 {
     if (t.Match(TokenType.Minus))
     {
         return(-ComputePositiveFactor(t));
     }
     return(ComputePositiveFactor(t));
 }
 Node ParseFactor(StringTokenizer t)
 {
     if (t.Match(TokenType.Minus))
     {
         return(new UnaryNode(TokenType.Minus, ParsePositiveFactor(t)));
     }
     return(ParsePositiveFactor(t));
 }
Exemple #7
0
        /// <summary>
        /// terme → facteur [opérateur-multiplicatif  facteur]*
        /// </summary>
        static double ComputeTerm(StringTokenizer t)
        {
            var fact = ComputeFactor(t);

            while (t.CurrentToken == TokenType.Mult ||
                   t.CurrentToken == TokenType.Div)
            {
                if (t.Match(TokenType.Mult))
                {
                    fact *= ComputeFactor(t);
                }
                if (t.Match(TokenType.Div))
                {
                    fact /= ComputeFactor(t);
                }
            }
            return(fact);
        }
 Node ParsePositiveFactor(StringTokenizer t)
 {
     if (t.MatchDouble(out var f))
     {
         return(new ConstantNode(f));
     }
     if (t.MatchIdentifier(out var id))
     {
         return(new IdentifierNode(id));
     }
     if (t.Match(TokenType.OpenPar))
     {
         Node expr = ParseCondExpression(t);
         if (!t.Match(TokenType.ClosePar))
         {
             return(new ErrorNode("Expected )."));
         }
         return(expr);
     }
     return(new ErrorNode("Expected ( or number."));
 }