Beispiel #1
0
        PluralFormsNode EqualityExpression()
        {
            PluralFormsNode p = RelationalExpression();

            if (p == null)
            {
                return(null);
            }
            PluralFormsNode n = p;

            if (Token.TokenType == PluralFormsToken.Type.Equal || Token.TokenType == PluralFormsToken.Type.NotEqual)
            {
                PluralFormsNode qn = new PluralFormsNode(new PluralFormsToken(Token));
                if (!NextToken())
                {
                    return(null);
                }
                p = RelationalExpression();
                if (p == null)
                {
                    return(null);
                }
                qn.SetNode(1, p);
                qn.SetNode(0, n);
                return(qn);
            }
            return(n);
        }
Beispiel #2
0
        PluralFormsNode MultiplicativeExpression()
        {
            PluralFormsNode p = PmExpression();

            if (p == null)
            {
                return(null);
            }
            PluralFormsNode n = p;

            if (Token.TokenType == PluralFormsToken.Type.Reminder)
            {
                PluralFormsNode qn = new PluralFormsNode(new PluralFormsToken(Token));
                if (!NextToken())
                {
                    return(null);
                }
                p = PmExpression();
                if (p == null)
                {
                    return(null);
                }
                qn.SetNode(1, p);
                qn.SetNode(0, n);
                return(qn);
            }
            return(n);
        }
Beispiel #3
0
        PluralFormsNode RelationalExpression()
        {
            PluralFormsNode p = MultiplicativeExpression();

            if (p == null)
            {
                return(null);
            }
            PluralFormsNode n = p;

            if (Token.TokenType == PluralFormsToken.Type.Greater ||
                Token.TokenType == PluralFormsToken.Type.Less ||
                Token.TokenType == PluralFormsToken.Type.GreaterOrEqual ||
                Token.TokenType == PluralFormsToken.Type.LessOrEqual)
            {
                PluralFormsNode qn = new PluralFormsNode(new PluralFormsToken(Token));
                if (!NextToken())
                {
                    return(null);
                }
                p = MultiplicativeExpression();
                if (p == null)
                {
                    return(null);
                }
                qn.SetNode(1, p);
                qn.SetNode(0, n);
                return(qn);
            }
            return(n);
        }
Beispiel #4
0
 public void SetNode(int i, PluralFormsNode n)
 {
     if (i >= 0 && i <= 2)
     {
         nodes[i] = n;
     }
 }
Beispiel #5
0
        public PluralFormsNode ReleaseNode(int i)
        {
            PluralFormsNode node = nodes[i];

            nodes[i] = null;
            return(node);
        }
Beispiel #6
0
        PluralFormsNode ParsePlural()
        {
            PluralFormsNode p = Expression();

            if (p == null)
            {
                return(null);
            }
            if (Token.TokenType != PluralFormsToken.Type.Semicolon)
            {
                return(null);
            }
            return(p);
        }
Beispiel #7
0
        PluralFormsNode Expression()
        {
            PluralFormsNode p = LogicalOrExpression();

            if (p == null)
            {
                return(null);
            }
            PluralFormsNode n = p;

            if (Token.TokenType == PluralFormsToken.Type.Question)
            {
                PluralFormsNode qn = new PluralFormsNode(new PluralFormsToken(Token));
                if (!NextToken())
                {
                    return(null);
                }
                p = Expression();
                if (p == null)
                {
                    return(null);
                }
                qn.SetNode(1, p);
                if (Token.TokenType != PluralFormsToken.Type.Colon)
                {
                    return(null);
                }
                if (!NextToken())
                {
                    return(null);
                }
                p = Expression();
                if (p == null)
                {
                    return(null);
                }
                qn.SetNode(2, p);
                qn.SetNode(0, n);
                return(qn);
            }
            return(n);
        }
Beispiel #8
0
        PluralFormsNode LogicalAndExpression()
        {
            PluralFormsNode p = EqualityExpression();

            if (p == null)
            {
                return(null);
            }
            PluralFormsNode ln = p;             // left

            if (Token.TokenType == PluralFormsToken.Type.LogicalAnd)
            {
                PluralFormsNode un = new PluralFormsNode(new PluralFormsToken(Token));                  // up
                if (!NextToken())
                {
                    return(null);
                }
                p = LogicalAndExpression();
                if (p == null)
                {
                    return(null);
                }
                PluralFormsNode rn = p;                 // right
                if (rn.Token.TokenType == PluralFormsToken.Type.LogicalAnd)
                {
                    // transform 1 && (2 && 3) -> (1 && 2) && 3
                    //     u                  r
                    // l       r     ->   u      3
                    //       2   3      l   2
                    un.SetNode(0, ln);
                    un.SetNode(1, rn.ReleaseNode(0));
                    rn.SetNode(0, un);
                    return(rn);
                }

                un.SetNode(0, ln);
                un.SetNode(1, rn);
                return(un);
            }
            return(ln);
        }
Beispiel #9
0
        PluralFormsNode PmExpression()
        {
            PluralFormsNode n;

            if (Token.TokenType == PluralFormsToken.Type.N || Token.TokenType == PluralFormsToken.Type.Number)
            {
                n = new PluralFormsNode(new PluralFormsToken(Token));
                if (!NextToken())
                {
                    return(null);
                }
            }
            else if (Token.TokenType == PluralFormsToken.Type.LeftBracket)
            {
                if (!NextToken())
                {
                    return(null);
                }
                PluralFormsNode p = Expression();
                if (p == null)
                {
                    return(null);
                }
                n = p;
                if (Token.TokenType != PluralFormsToken.Type.RightBracket)
                {
                    return(null);
                }
                if (!NextToken())
                {
                    return(null);
                }
            }
            else
            {
                return(null);
            }
            return(n);
        }
Beispiel #10
0
        PluralFormsNode LogicalOrExpression()
        {
            PluralFormsNode p = LogicalAndExpression();

            if (p == null)
            {
                return(null);
            }
            PluralFormsNode ln = p;

            if (Token.TokenType == PluralFormsToken.Type.LogicalOr)
            {
                PluralFormsNode un = new PluralFormsNode(new PluralFormsToken(Token));
                if (!NextToken())
                {
                    return(null);
                }
                p = LogicalOrExpression();
                if (p == null)
                {
                    return(null);
                }
                PluralFormsNode rn = p;                 // right
                if (rn.Token.TokenType == PluralFormsToken.Type.LogicalOr)
                {
                    // see logicalAndExpression comment
                    un.SetNode(0, ln);
                    un.SetNode(1, rn.ReleaseNode(0));
                    rn.SetNode(0, un);
                    return(rn);
                }

                un.SetNode(0, ln);
                un.SetNode(1, rn);
                return(un);
            }
            return(ln);
        }
         public void SetNode (int i, PluralFormsNode n)
         {
			 if (i >= 0 && i <= 2)
				nodes[i] = n;
         }
		public void Init (int nplurals, PluralFormsNode plural)
		{
			this.nplurals = nplurals;
			this.plural = plural;
		}
		PluralFormsNode Expression ()
		{
			PluralFormsNode p = LogicalOrExpression ();
			if (p == null)
				return null;
			PluralFormsNode n = p;
			if (Token.TokenType == PluralFormsToken.Type.Question)
			{
				PluralFormsNode qn = new PluralFormsNode (new PluralFormsToken (Token));
				if (! NextToken ())
				{
					return null;
				}
				p = Expression ();
				if (p == null)
				{
					return null;
				}
				qn.SetNode (1, p);
				if (Token.TokenType != PluralFormsToken.Type.Colon)
				{
					return null;
				}
				if (! NextToken ())
				{
					return null;
				}
				p = Expression ();
				if (p == null)
				{
					return null;
				}
				qn.SetNode (2, p);
				qn.SetNode (0, n);
				return qn;
			}
			return n;
		}
		PluralFormsNode LogicalOrExpression ()
		{
			PluralFormsNode p = LogicalAndExpression ();
			if (p == null)
				return null;
			PluralFormsNode ln = p;
			if (Token.TokenType == PluralFormsToken.Type.LogicalOr)
			{
				PluralFormsNode un = new PluralFormsNode (new PluralFormsToken(Token));
				if (! NextToken ())
				{
					return null;
				}
				p = LogicalOrExpression ();
				if (p == null)
				{
					return null;
				}
				PluralFormsNode rn = p; // right
				if (rn.Token.TokenType == PluralFormsToken.Type.LogicalOr)
				{
					// see logicalAndExpression comment
					un.SetNode (0, ln);
					un.SetNode (1, rn.ReleaseNode (0));
					rn.SetNode (0, un);
					return rn;
				}
				
				un.SetNode (0, ln);
				un.SetNode (1, rn);
				return un;
			}
			return ln;
		}
		PluralFormsNode LogicalAndExpression ()
		{
			PluralFormsNode p = EqualityExpression ();
			if (p == null)
				return null;
			PluralFormsNode ln = p; // left
			if (Token.TokenType == PluralFormsToken.Type.LogicalAnd)
			{
				PluralFormsNode un = new PluralFormsNode (new PluralFormsToken(Token)); // up
				if (! NextToken ())
				{
					return null;
				}
				p = LogicalAndExpression ();
				if (p == null)
				{
					return null;
				}
				PluralFormsNode rn = p; // right
				if (rn.Token.TokenType == PluralFormsToken.Type.LogicalAnd)
				{
					// transform 1 && (2 && 3) -> (1 && 2) && 3
					//     u                  r
					// l       r     ->   u      3
					//       2   3      l   2
					un.SetNode (0, ln);
					un.SetNode (1, rn.ReleaseNode (0));
					rn.SetNode (0, un);
					return rn;
				}

				un.SetNode (0, ln);
				un.SetNode (1, rn);
				return un;
			}
			return ln;
		}
		PluralFormsNode EqualityExpression ()
		{
			PluralFormsNode p = RelationalExpression ();
			if (p == null)
				return null;
			PluralFormsNode n = p;
			if (Token.TokenType == PluralFormsToken.Type.Equal || Token.TokenType == PluralFormsToken.Type.NotEqual)
			{
				PluralFormsNode qn = new PluralFormsNode (new PluralFormsToken(Token));
				if (! NextToken ())
				{
					return null;
				}
				p = RelationalExpression ();
				if (p == null)
				{
					return null;
				}
				qn.SetNode (1, p);
				qn.SetNode (0, n);
				return qn;
			}
			return n;
		}
Beispiel #17
0
        public bool Parse(PluralFormsCalculator calculator)
        {
            if (Token.TokenType != PluralFormsToken.Type.Nplurals)
            {
                return(false);
            }
            if (!NextToken())
            {
                return(false);
            }
            if (Token.TokenType != PluralFormsToken.Type.Assign)
            {
                return(false);
            }
            if (!NextToken())
            {
                return(false);
            }
            if (Token.TokenType != PluralFormsToken.Type.Number)
            {
                return(false);
            }
            int nplurals = Token.Number;

            if (!NextToken())
            {
                return(false);
            }
            if (Token.TokenType != PluralFormsToken.Type.Semicolon)
            {
                return(false);
            }
            if (!NextToken())
            {
                return(false);
            }
            if (Token.TokenType != PluralFormsToken.Type.Plural)
            {
                return(false);
            }
            if (!NextToken())
            {
                return(false);
            }
            if (Token.TokenType != PluralFormsToken.Type.Assign)
            {
                return(false);
            }
            if (!NextToken())
            {
                return(false);
            }
            PluralFormsNode plural = ParsePlural();

            if (plural == null)
            {
                return(false);
            }
            if (Token.TokenType != PluralFormsToken.Type.Semicolon)
            {
                return(false);
            }
            if (!NextToken())
            {
                return(false);
            }
            if (Token.TokenType != PluralFormsToken.Type.Eof)
            {
                return(false);
            }
            calculator.Init(nplurals, plural);
            return(true);
        }
		PluralFormsNode MultiplicativeExpression ()
		{
			PluralFormsNode p = PmExpression ();
			if (p == null)
			{
				return null;
			}
			PluralFormsNode n = p;
			if (Token.TokenType == PluralFormsToken.Type.Reminder)
			{
				PluralFormsNode qn = new PluralFormsNode (new PluralFormsToken(Token));
				if (! NextToken())
				{
					return null;
				}
				p = PmExpression ();
				if (p == null)
				{
					return null;
				}
				qn.SetNode (1, p);
				qn.SetNode (0, n);
				return qn;
			}
			return n;
		}
Beispiel #19
0
 public void Init(int nplurals, PluralFormsNode plural)
 {
     this.nplurals = nplurals;
     this.plural   = plural;
 }
Beispiel #20
0
 public PluralFormsCalculator()
 {
     nplurals = 0;
     plural   = null;
 }
		public PluralFormsCalculator ()
		{
			nplurals = 0;
			plural = null;
		}
		PluralFormsNode RelationalExpression ()
		{
			PluralFormsNode p = MultiplicativeExpression ();
			if (p == null)
				return null;
			PluralFormsNode n = p;
			if (Token.TokenType == PluralFormsToken.Type.Greater
			    || Token.TokenType == PluralFormsToken.Type.Less
				|| Token.TokenType == PluralFormsToken.Type.GreaterOrEqual
				|| Token.TokenType == PluralFormsToken.Type.LessOrEqual)
			{
				PluralFormsNode qn = new PluralFormsNode (new PluralFormsToken(Token));
				if (! NextToken ()) {
					return null;
				}
				p = MultiplicativeExpression ();
				if (p == null) {
					return null;
				}
				qn.SetNode (1, p);
				qn.SetNode (0, n);
				return qn;
			}
			return n;
		}
		PluralFormsNode PmExpression ()
		{
			PluralFormsNode n;
			if (Token.TokenType == PluralFormsToken.Type.N || Token.TokenType == PluralFormsToken.Type.Number) {
				n = new PluralFormsNode (new PluralFormsToken(Token));
				if (! NextToken ()) {
					return null;
				}
			} else if (Token.TokenType == PluralFormsToken.Type.LeftBracket) {
				if (! NextToken ()) {
					return null;
				}
				PluralFormsNode p = Expression ();
				if (p == null) {
					return null;
				}
				n = p;
				if (Token.TokenType != PluralFormsToken.Type.RightBracket) {
					return null;
				}
				if (! NextToken ()) {
					return null;
				}
			} else {
				return null;
			}
			return n;
		}