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); }
public void SetNode(int i, PluralFormsNode n) { if (i >= 0 && i <= 2) { nodes[i] = n; } }
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); }
public PluralFormsNode ReleaseNode(int i) { PluralFormsNode node = nodes[i]; nodes[i] = null; return(node); }
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); }
public static void IterateNodes(PluralFormsNode node, IterateNodesDelegate doBefore, IterateNodesDelegate doAfter) { doBefore(node); for (int i = 0; i < node.NodesCount; i++) { if (node.Nodes[i] != null) { IterateNodes(node.Nodes[i], doBefore, doAfter); } } doAfter(node); }
PluralFormsNode ParsePlural() { PluralFormsNode p = Expression(); if (p == null) { return(null); } if (Token.TokenType != PluralFormsToken.Type.Semicolon) { return(null); } return(p); }
/// <summary> /// Evaluate the specified number, returns msgstr index. /// </summary> /// <param name='n'> /// Number to evaluate /// </param> /// <param name='traceToFile'> /// Debug purposes only. Trace to file an evaluation tree. /// </param> public long Evaluate(long n, bool traceToFile) { if (plural == null) { return(0); } #if DEBUG RecursiveTracer tracer = new RecursiveTracer(); tracer.Text.AppendFormat("Expression: {0}", expression); tracer.Text.AppendLine(); tracer.Text.AppendFormat("Evaluate: {0}", n); tracer.Text.AppendLine(); tracer.Text.AppendLine(); #endif long number = plural.Evaluate(n); #if DEBUG PluralFormsNode.IterateNodes( plural, delegate(PluralFormsNode node) { tracer.Text.AppendFormat("{0}: ", tracer.Level++); tracer.Indent(); if (node.Tracer != null) { tracer.Text.AppendLine(node.Tracer.Text.ToString()); } }, delegate(PluralFormsNode node) { tracer.Level--; } ); if (traceToFile) { tracer.SaveToFile("Evaluations.txt"); } #endif if (number < 0 || number > nplurals) { return(0); } return(number); }
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 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 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); }
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 DumpNodes(string fileName) { if (plural != null) { RecursiveTracer tracer = new RecursiveTracer(); tracer.Text.Append(expression); tracer.Text.AppendLine(); PluralFormsNode.IterateNodes( plural, delegate(PluralFormsNode node) { tracer.Text.AppendFormat("{0}: ", tracer.Level++); tracer.Indent(); tracer.Text.AppendLine(node.ToString()); }, delegate(PluralFormsNode node) { tracer.Level--; } ); tracer.SaveToFile(fileName); } }
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 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; }
public void SetNode(int i, PluralFormsNode n) { if (i >= 0 && i <= 2) nodes[i] = n; }
public static void IterateNodes(PluralFormsNode node, IterateNodesDelegate doBefore, IterateNodesDelegate doAfter) { doBefore(node); for(int i = 0; i < node.NodesCount; i++) { if (node.Nodes[i] != null) IterateNodes(node.Nodes[i], doBefore, doAfter); } doAfter(node); }
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 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; }
public PluralFormsCalculator(string expression) { nplurals = 0; plural = null; this.expression = expression; }
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 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 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; }
internal void Init(int nplurals, PluralFormsNode plural) { this.nplurals = nplurals; this.plural = plural; }
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; }