Example #1
0
        private static OperatorTable <T> BuildOperatorsTable <T>(TokenParser <T> lexer)
            where T : Token
        {
            Func <T, T, ReservedOpToken, T> fn = (lhs, rhs, op) =>
            {
                return(new BinaryOp(lhs, rhs, op) as T);
            };

            Func <ReservedOpToken, Func <T, T, T> > binop = op => new Func <T, T, T>((T lhs, T rhs) =>
            {
                return(fn(lhs, rhs, op));
            });

            Func <string, Parser <Func <T, T, T> > > resOp = name => from op in lexer.ReservedOp(name) select binop(op);

            var equals   = new Infix <T>("=", resOp("="), Assoc.Left);
            var mult     = new Infix <T>("*", resOp("*"), Assoc.Left);
            var divide   = new Infix <T>("/", resOp("/"), Assoc.Left);
            var plus     = new Infix <T>("+", resOp("+"), Assoc.Left);
            var minus    = new Infix <T>("-", resOp("-"), Assoc.Left);
            var lessThan = new Infix <T>("<", resOp("<"), Assoc.Left);

            var binops = new OperatorTable <T>();

            binops.AddRow().Add(equals)
            .AddRow().Add(mult).Add(divide)
            .AddRow().Add(plus).Add(minus)
            .AddRow().Add(lessThan);

            return(binops);
        }
Example #2
0
        public DiceGrammar()
        {
            DefaultParserFlags = ParserFlags.IGNORE_LEADING_WHITESPACE | ParserFlags.IGNORE_TRAILING_WHITESPACE;

            var digits = "0123456789";
            var d      = Keyword("d");
            var number = Token(c => digits.Contains(c)).CreateAst("NUMBERLIT");
            var die    = ((d + number).CreateAst("SINGLE_DIE") | (number + d + number).CreateAst("MULTIPLE_DICE"));

            var opTable = new OperatorTable();

            opTable.AddOperator("+", 2);
            opTable.AddOperator("-", 2);

            opTable.AddOperator("*", 3);

            var statement  = LateBound();
            var expression = LateBound();

            var term = LateBound();
            var op   = Operator(opTable).CreateAst("OP");

            expression.SetSubParser(Expression(term, op, opTable));
            term.SetSubParser((die.PassThrough() | number.PassThrough()).CreateAst("TERM"));

            this.Root = expression;

            //Console.WriteLine("Result: " + CalculateDieRoll(TestParse("4d6"), new Random()));
            //Console.WriteLine("Result: " + CalculateDieRoll(TestParse("4d6+8"), new Random()));
            //Console.WriteLine("Result: " + CalculateDieRoll(TestParse("4d6+5d10+3-1d6"), new Random()));
            //Console.WriteLine("Result: " + CalculateDieRoll(TestParse("4d6+d10"), new Random()));
        }
Example #3
0
 public TokenSeqToTerm(OperatorTable opTable)
 {
     IS = new TokenStack("IS");
     OS = new TokenStack("OS"); // operator stack
     PS = new TokenStack("PS");
     IS.Push(SeqStartToken);
     inOpAtBoS = false;
 }
Example #4
0
        /// <summary>
        /// 新規にパーサーを作成します。
        /// </summary>
        private Grammar CreateParser(AngleMode angleMode)
        {
            var sDelim = Scanners.IsWhitespaces().Many_();
            var OPs    = Terms.GetOperatorsInstance(
                "+", "-", "**", "*", "/", "%", "(", ")", ",", "#");

            var lToken = OPs.Lexer | Lexers.LexDecimal() | Lexers.LexWord();
            var lexeme = Lexers.Lexeme(sDelim, lToken).FollowedBy(Parsers.Eof());

            var pNumber = Terms.OnDecimal((from, len, s) => double.Parse(s));
            var pWord   = Terms.OnWord((from, len, s) => s);

            Terms.FromSimpleToken <string, string>((from, len, s) => s);

            var pPlus   = GetOperator(OPs, "+", new Binary((a, b) => (a + b)));
            var pMinus  = GetOperator(OPs, "-", new Binary((a, b) => (a - b)));
            var pMul    = GetOperator(OPs, "*", new Binary((a, b) => (a * b)));
            var pDiv    = GetOperator(OPs, "/", new Binary((a, b) => (a / b)));
            var pMod    = GetOperator(OPs, "%", new Binary((a, b) => (a % b)));
            var pPow    = GetOperator(OPs, "**", new Binary((a, b) => Math.Pow(a, b)));
            var pNone   = GetOperator(OPs, "+", new Unary(n => n));
            var pNeg    = GetOperator(OPs, "-", new Unary(n => - n));
            var opTable = new OperatorTable <double>()
                          .Infixl(pPlus, 10)
                          .Infixl(pMinus, 10)
                          .Infixl(pMul, 20)
                          .Infixl(pDiv, 20)
                          .Infixl(pMod, 20)
                          .Infixr(pPow, 30)
                          .Prefix(pNone, 40)
                          .Prefix(pNeg, 40);

            var pLParen = OPs.GetParser("(");
            var pRParen = OPs.GetParser(")");
            var pComma  = OPs.GetParser(new string[] { ",", "#" });

            var lazyExpr  = new Grammar[1];
            var pLazyExpr = Parsers.Lazy <double>(() => lazyExpr[0]);
            var pArg
                = pLazyExpr.SepEndBy(pComma).Between(pLParen, pRParen)
                  | pLParen.Seq(pRParen).Seq(Parsers.Return(new double[0]));
            var pTerm
                = pLazyExpr.Between(pLParen, pRParen)
                  | pWord.And(pArg.Optional(), new Map <string, double[], double>(CalcFunc))
                  | pNumber;

            var pExpr = Expressions.BuildExpressionParser(pTerm, opTable);

            lazyExpr[0] = pExpr;
            return(Parsers.ParseTokens(lexeme, pExpr.FollowedBy(Parsers.Eof()), "calculator"));
        }
Example #5
0
        public Dependency(String uniqueName, String operatorToken, Version version)
        {
            UniqueName    = uniqueName;
            OperatorToken = operatorToken;
            Version       = version;

            TestDelegate d;

            if (!OperatorTable.TryGetValue(operatorToken, out d))
            {
                throw new ArgumentOutOfRangeException("Unrecognized constraint operator: " + operatorToken);
            }
            _testDelegate = d;
        }
        public void Init(OperatorTable ot)
        {
            IComparer <string> comparer = new OTMComp();

            this.map = new SortedList <string, List <Operator> >(comparer);
            foreach (Operator @operator in ot.GetOperators())
            {
                string   symbol = @operator.GetSymbol();
                Operator item   = @operator;
                if (!item.NotInParser())
                {
                    List <Operator> list;
                    if (this.map.ContainsKey(symbol))
                    {
                        list = this.map[symbol];
                        list.Add(item);
                    }
                    else
                    {
                        list = new List <Operator> {
                            item
                        };
                        this.map.Add(symbol, list);
                    }
                    if (item.IsTernary())
                    {
                        string rhsSymbol = ((TernaryOperator)@operator).GetRhsSymbol();
                        if (!item.NotInParser())
                        {
                            list = this.map[rhsSymbol];
                            if (list == null)
                            {
                                list = new List <Operator>();
                            }
                            list.Add(((TernaryOperator)@operator).GetRhsOperator());
                            this.map.Add(rhsSymbol, list);
                        }
                    }
                }
            }
            this.tokens = new SortedList <string, OperatorToken>(comparer);
            foreach (string str3 in this.map.Keys)
            {
                this.tokens.Add(str3, new OperatorToken(this.map[str3]));
            }
        }
Example #7
0
        /// <summary> Creates a Parser object based on information described by OperatorTable.</summary>
        /// <param name="term">parser for the terminals.
        /// </param>
        /// <param name="table">the operator table.
        /// </param>
        /// <returns> the expression parser.
        /// </returns>
        public static Parser <T> BuildExpressionParser <T>(Parser <T> term, OperatorTable <T> table)
        {
            OperatorTable <T> .Operator[] ops = table.Operators;
            if (ops.Length == 0)
            {
                return(term);
            }
            int          begin = 0;
            int          prec  = ops[0].Precedence;
            OperatorKind kind  = ops[0].Kind;
            int          end   = 0;
            Parser <T>   ret   = term;

            for (int i = 1; i < ops.Length; i++)
            {
                OperatorTable <T> .Operator op = ops[i];
                end = i;
                if (op.Precedence == prec && op.Kind == kind)
                {
                    continue;
                }
                else
                {
                    end = i;
                    Parser p = slice <T>(kind, ops, begin, end);
                    ret   = build(p, kind, ret);
                    begin = i;
                    prec  = ops[i].Precedence;
                    kind  = ops[i].Kind;
                }
            }
            if (end != ops.Length)
            {
                end  = ops.Length;
                kind = ops[begin].Kind;
                Parser p = slice <T>(kind, ops, begin, end);
                ret = build(p, kind, ret);
            }
            return(ret);
        }
Example #8
0
        public async Task <IActionResult> Calculate(string meansOfCalculation, int firstNumber, int secondNumber)
        {
            if (!OperatorTable.ContainsKey(meansOfCalculation))
            {
                return(BadRequest());
            }

            var targetEndpoint  = OperatorTable[meansOfCalculation];
            var request         = CreateHttpRequest(HttpMethod.Get, targetEndpoint, firstNumber, secondNumber);
            var responseContent = await SendRequestAndReadResponse(request);

            var result = HandleResponse(meansOfCalculation, firstNumber, secondNumber, responseContent);

            var saveRequest = SendResultToDatabase(new Calculation
            {
                NumberOne         = firstNumber,
                NumberTwo         = secondNumber,
                Result            = result,
                TypeOfCalculation = ChangeStringValue(meansOfCalculation)
            });

            var jsonOptions = new JsonSerializerOptions
            {
                PropertyNameCaseInsensitive = true
            };

            var json   = await(await _client.SendAsync(saveRequest)).Content.ReadAsStringAsync();
            var entity = JsonSerializer.Deserialize <Calculation>(json, jsonOptions);

            var id = entity.CalculationId;

            TempData["result"]   = result;
            TempData["entityId"] = id.ToString();

            return(View("Index"));
        }
Example #9
0
 public Operator(OperatorTable OperatorTable)
 {
     this.OperatorTable = OperatorTable;
 }
Example #10
0
 public Expression(Parser TermParser, Parser OperatorParser, OperatorTable OperatorTable)
 {
     this.TermParser     = TermParser;
     this.OperatorParser = OperatorParser;
     this.OperatorTable  = OperatorTable;
 }
Example #11
0
        /// <summary>
        /// Execute operator
        /// </summary>
        /// <param name="n">tree node</param>
        public void ExecOp(TreeNode n)
        {
            NetLogoObject obj = null;
            //create parse tree to get operator list THIS IS A HACK
            ParseTree t = new ParseTree("");

            try
            {
                if (nodeFull(n))
                {
                    if (t.IsOperator(n.left))
                    {
                        ExecOp(n.left);
                    }

                    if (t.IsOperator(n.right))
                    {
                        ExecOp(n.right);
                    }

#if OPTRACK || ALLTRACK
                    Performance.PeformanceTracker.StartStopWatch(n.data);
#endif

                    obj = OperatorTable.Call <NetLogoObject>(sys.Assign(n.left.data, false),
                                                             sys.Assign(n.right.data, false), n.data);
                }
                else if (n.left != null)
                {
                    obj = OperatorTable.Call <NetLogoObject>(sys.Assign(n.left.data, false),
                                                             new NetLogoObject()
                    {
                        ptrID = "NULLPTR"
                    }, n.data);
                }
                else
                {
                    obj = OperatorTable.Call <NetLogoObject>(new NetLogoObject()
                    {
                        ptrID = "NULLPTR"
                    },
                                                             new NetLogoObject()
                    {
                        ptrID = "NULLPTR"
                    }, n.data);
                }
                //place results of the operation on tree
                TreeNode tempNode = new TreeNode(obj.value.ToString());
#if OPTRACK || ALLTRACK
                Performance.PeformanceTracker.Stop(n.data);
#endif
                //replace node
                if (n.parent != null)
                {
                    if (n.parent.left == n)
                    {
                        n.parent.left = tempNode;
                    }
                    else if (n.parent.right == n)
                    {
                        n.parent.right = tempNode;
                    }

                    tempNode.parent = n.parent;
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }
Example #12
0
            public static BaseTerm FindRegexMatches(
                OperatorTable opTable, string source, string matchPattern, string[] options)
            {
                Regex        re        = null;
                RegexOptions reOptions = RegexOptions.None;

                if (options != null)
                {
                    foreach (string o in options)
                    {
                        switch (o.ToLower())
                        {
                        case "ignorecase":
                            reOptions |= RegexOptions.IgnoreCase;
                            break;

                        case "multiline":
                            reOptions |= RegexOptions.Multiline;
                            break;

                        case "singleline":
                            reOptions |= RegexOptions.Singleline;
                            break;

                        case "explicitcapture":
                            reOptions |= RegexOptions.ExplicitCapture;
                            break;

                        case "cultureinvariant":
                            reOptions |= RegexOptions.CultureInvariant;
                            break;

                        default:
                            IO.Error("match_regex -- unsupported option '{0}'", o);
                            break;
                        }
                    }
                    ;
                }

                try
                {
                    re = new Regex(matchPattern, reOptions); //, RegexOptions.Multiline);
                }
                catch (Exception x)
                {
                    IO.Error("Error in regular expression '{0}'\r\nMessage: {1}", matchPattern, x.Message);
                }

                Match m = re.Match(source);

                if (!m.Success)
                {
                    return(null);
                }

                int[]    gnums  = re.GetGroupNumbers();
                BaseTerm groups = new ListTerm();

                while (m.Success)
                {
                    for (int i = 1; i < gnums.Length; i++) // start at group 1 (0 is the fully captured match string)
                    {
                        Group    g        = m.Groups[gnums[i]];
                        BaseTerm captures = new ListTerm();
                        string   groupId  = re.GetGroupNames()[i];
                        int      groupNo;
                        BaseTerm groupIdTerm;

                        foreach (Capture c in g.Captures)
                        {
                            captures = ((ListTerm)captures).AppendElement(new StringTerm(c.ToString()));
                        }

                        if (int.TryParse(groupId, out groupNo))
                        {
                            groupIdTerm = new DecimalTerm(groupNo);
                        }
                        else
                        {
                            groupIdTerm = new StringTerm(re.GetGroupNames()[i]);
                        }

                        groups = ((ListTerm)groups).AppendElement(
                            new OperatorTerm(opTable, ":", groupIdTerm, captures));
                    }

                    m = m.NextMatch();
                }

                if (((ListTerm)groups).ProperLength == 1)
                {
                    groups = groups.Arg(0); // groups is <groupname>:[<captures>]

                    if (groups.Arg(0) is DecimalTerm)
                    {
                        groups = groups.Arg(1); // anonymous group, just return the list of captures
                    }
                }

                return(groups);
            }
Example #13
0
 public void Init(JepInstance jep)
 {
     this.nf = jep.NodeFac;
     this.ot = jep.OpTab;
 }