コード例 #1
0
        // 這裡包含了 MUTAN 語法的所有定義
        // 定義是利用一個判斷方法來實現的
        // 任何字串都可以用判斷方法來判斷是否符合某定義

        //MUTAN 語法的形式定義

        //expr  :=  *          (任何不為空的表達式, 例如 1+1, (1>2)&(VAR=3), !(true&true|false) 實施時利用表達式解析器判斷是否合法)
        //decla :=  [$]ID=expr (變量宣告, 變量名如以 $ 開頭表示是臨時變量, AZUSA 在退出時不會保存)
        //exec  :=  RID(expr|"")   (函式調用, RID 是函式名, 參數可以是表達式或空白字串)
        //term  :=  "END"|"BREAK" (中斷執行用)
        //basic :=  decla|exec|term
        //multi :=  basic{;basic}
        //cond  :=  expr?multi
        //stmt  :=  multi|cond
        //loop  :=  @stmt
        //resp  :=  ?stmt
        //line  :=  stmt|loop|resp

        //(區塊的定義)
        //namedblock :=
        //.ID{
        //block
        //}

        //respblock  :=
        //?{
        //block
        //}

        //condblock  :=
        //expr{
        //block
        //}

        //loopblock :=
        //@{
        //block
        //}

        //block := (line|namedblock|respblock|condblock|loopblock)*  (最終定義, 只要是 block 就是 MUTAN)



        //判斷是否一個 decla (宣告)
        static public bool IsDecla(string line)
        {
            //首先得有一個等號
            //first there has to be an equal sign
            if (line.Contains('='))
            {
                //暫存運算結果
                string tmp;

                //以等號為界分割字串
                string[] split = line.Split('=');

                //等號的左手邊應為變數名
                //變數名必須是一個簡單字串, 不能含有運算符或者其他表達式, 我們可以利用表達式運算器算一下, 如果算出來跟原來一樣, 就是合法字串
                //或者左手邊可以是一個已經宣告過的變數名
                //second the left hand side must be a simple string that is not further evaluable ,ie an expression cannot be used as an ID
                // or it can be an existing ID
                if (ExprParser.TryParse(split[0], out tmp) && tmp == split[0].Trim() || Variables.Exist(split[0].Trim()))
                {
                    return(true);
                }
            }

            return(false);
        }
コード例 #2
0
        //接下來就是區塊的定義


        //判斷是否一個 namedblock (命名區塊)
        static public bool IsNamedBlock(string[] lines)
        {
            //首先要以 .(名稱){ 的格式開頭, 以 } 結束
            //first the first line has to start with '.', ends with '{'
            //the last line should be "}"
            if (lines[0].Trim().StartsWith(".") && lines[0].Trim().EndsWith("{") && lines[lines.Length - 1].Trim() == "}")
            {
                //取得區塊名
                string ID = lines[0].Trim().Trim('.', '{');

                //暫存運算結果
                string tmp;

                //區塊名必須是一個簡單字串, 不能含有運算符或者其他表達式, 我們可以利用表達式運算器算一下, 如果算出來跟原來一樣, 就是合法字串
                //second the ID should not be further evaluable, and also should not start/end with spaces
                if (ExprParser.TryParse(ID, out tmp) && tmp == ID)
                {
                    //把第一行和最後一行去掉後的內容應該要是一個 block (歸遞定義)
                    //lastly the content should be a block
                    string[] content = new string[lines.Length - 2];
                    for (int i = 1; i < lines.Length - 1; i++)
                    {
                        content[i - 1] = lines[i];
                    }
                    return(IsBlock(content));
                }
            }
            return(false);
        }
コード例 #3
0
    public void TrailingZerosOnDecimal()
    {
        var f = ExprParser.ParseOrThrow("1.2340000");

        Assert.AreEqual(f, new One() + (Literal.Create(234) / Literal.Create(1000)));
        Assert.AreEqual(f, (Literal.Create(234) / Literal.Create(1000)) + new One());
    }
コード例 #4
0
        public virtual Expr parseStatement(string paramString)
        {
            paramString = StringUtils.escapeParametricExpression(paramString);
            ExprParser exprParser = new ExprParser();

            try
            {
                exprParser.parse(new ExprLexer(paramString));
            }
            catch (IOException iOException)
            {
                Console.WriteLine(iOException.ToString());
                Console.Write(iOException.StackTrace);
                throw new ExprException(iOException.Message);
            }
            Expr expr = exprParser.get();

            Exprs.ToUpper(expr);
            if (expr is ExprEvaluatable)
            {
                expr = ((ExprEvaluatable)expr).evaluate(this);
            }
            else
            {
                throw new ExprException("Not Evaluatable result for: " + paramString);
            }
            return(expr);
        }
コード例 #5
0
    public void Beta1()
    {
        var actual   = ExprParser.ParseOrThrow("β_1");
        var expected = new Identifier("β_1");

        Assert.AreEqual(expected, actual);
    }
コード例 #6
0
        static void Main(string[] args)
        {
            do
            {
                Console.Write("> ");
                string            expr        = Console.ReadLine();
                AntlrInputStream  inputStream = new AntlrInputStream(expr);
                ExprLexer         exprLexer   = new ExprLexer(inputStream);
                CommonTokenStream tokenStream = new CommonTokenStream(exprLexer);
                ExprParser        exprParser  = new ExprParser(tokenStream);
                exprParser.BuildParseTree = true;
                var cst = exprParser.compileUnit();
                try
                {
                    var ast = new BuildAstVisitor().VisitCompileUnit(cst);
#if DEBUG
                    PrintAst(ast, 0);
#endif
                    Console.WriteLine($"= {new AstEvaluator().Visit(ast)}");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            } while (true);
        }
コード例 #7
0
    public void Pi()
    {
        var actual   = ExprParser.ParseOrThrow("2×π");
        var expected = Literal.Create(2) * new Identifier("π");

        Assert.AreEqual(expected, actual);
    }
コード例 #8
0
ファイル: ParenParse.cs プロジェクト: TranHHoang/HLang
        public AstNode Parse(ExprParser parser, Token.Token token)
        {
            var expr = parser.Parse(0);

            parser.Consume(Token.Token.TokenType.RightParen);
            return(expr);
        }
コード例 #9
0
        public async Task <IActionResult> Get7([FromBody] ConditionsRequest request)
        {
            List <Entity>    listTest       = request.entities;
            ListOfConditions conditionsList = request.ListOfConditions;

            foreach (var item in conditionsList.conditions)
            {
                item.result = validateCondition(entities: listTest, condition: item);
            }

            string[] arrayOfResult = conditionsList.conditions.Select(c => c.result.ToString().ToLower()).ToArray();
            string   newResult     = string.Format(conditionsList.fullCondition, arrayOfResult);

            var              ep = new ExprParser();
            string           lambdaExpression = newResult.Replace("OR", "||").Replace("AND", "&&");
            LambdaExpression lambda;                                                     // = ep.Parse(lambdaExpression);

            lambda = ep.Parse("(10 * 15 – 11) > 100 ? 'right result' : 'wrong result'"); // string constant is enclosed by either ‘ or \”
            int result = (int)ep.Run(lambda);

            //string result = (string)ep.Run(lambda);

            _presenter.Populate(result.ToString());
            return(_presenter.ViewModel);
        }
コード例 #10
0
    public void NestedEqualsOpTest()
    {
        var e = ExprParser.ParseOrThrow("a=b=c");

        if (e is EqualsOp eo)
        {
            if (eo.Left is EqualsOp oo && oo.Left is Identifier i1 && oo.Right is Identifier i2)
            {
                Assert.AreEqual(i1.Definition, "a");
                Assert.AreEqual(i2.Definition, "b");
            }
            else
            {
                Assert.Fail($"{eo.Left} not an equalsop.");
            }


            if (eo.Right is Identifier i)
            {
                Assert.AreEqual(i.Definition, "c");
            }
            else
            {
                Assert.Fail($"{eo.Right} is not an identifier.");
                Assert.Fail();
            }
        }
コード例 #11
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
//ORIGINAL LINE: public java.util.List<nomitech.common.db.local.FunctionArgumentTable> getReferringVariablesForStatement(String paramString) throws java.io.IOException, org.boris.expr.ExprException
        public virtual IList <FunctionArgumentTable> getReferringVariablesForStatement(string paramString)
        {
            this.refArgsIns = new List <object>();
            ExprParser exprParser = new ExprParser();

            exprParser.ParserVisitor = this;
            exprParser.parse(new ExprLexer(paramString));
            System.Collections.IList list = this.refArgsIns;
            this.refArgsIns = null;
            List <object> arrayList1 = new List <object>();
            List <object> arrayList2 = new List <object>();

            foreach (FunctionArgumentTable functionArgumentTable in list)
            {
                arrayList1.Add(functionArgumentTable);
                if (functionArgumentTable.Type.Equals("datatype.calcvalue") && !arrayList2.Contains(functionArgumentTable.ValidationStatement))
                {
                    arrayList2.Add(functionArgumentTable.ValidationStatement);
                }
            }
            foreach (string str in arrayList2)
            {
                list = getReferringVariablesForStatement(str);
                foreach (FunctionArgumentTable functionArgumentTable in list)
                {
                    if (!arrayList1.Contains(functionArgumentTable))
                    {
                        arrayList1.Add(functionArgumentTable);
                    }
                }
            }
            return(list);
        }
コード例 #12
0
    public void PowerOpTest()
    {
        var actual = PowerOp.Create(Two, D);

        Assert.AreEqual(ExprParser.ParseOrThrow("2^d"), actual);
        Assert.AreEqual(Two.Raise(D), actual);
    }
コード例 #13
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
//ORIGINAL LINE: protected org.boris.expr.Expr parseExpression(String paramString) throws org.boris.expr.ExprException
        protected internal virtual Expr parseExpression(string paramString)
        {
            Expr expr;

            if (!paramString.StartsWith("=", StringComparison.Ordinal))
            {
                expr = Exprs.parseValue(paramString);
            }
            else
            {
                paramString = paramString.Substring(1);
                ExprParser exprParser = new ExprParser();
                exprParser.ParserVisitor = this;
                try
                {
                    exprParser.parse(new ExprLexer(paramString));
                }
                catch (IOException iOException)
                {
                    throw new ExprException(iOException);
                }
                expr = exprParser.get();
            }
            return(expr);
        }
コード例 #14
0
    public void ExprTest()
    {
        const string input  = "12 * 3 + foo(-3, x)() * (2 + 1)";
        var          actual = AddOp.Create(
            MultiplyOp.Create(
                Literal.Create(12),
                Literal.Create(3)
                ),
            MultiplyOp.Create(
                Call.Create(
                    Call.Create(
                        new Identifier("foo"),
                        NegativeOp.Create(Literal.Create(3)),
                        new Identifier("x")
                        )
                    ),
                AddOp.Create(
                    new Two(),
                    new One()
                    )
                )
            ).Simplify();
        var expected = ExprParser.ParseOrThrow(input);

        Assert.AreEqual(expected.Simplify(), actual);
    }
コード例 #15
0
    public void Test6()
    {
        const string input = "(1-a*(3-4)*x/21)^3-(1/2)^5+11-(16.31^3-a)*r*f(x)";
        var          ex2   = ExprParser.ParseOrThrow("16.31^3");

        ex2 = ex2.Simplify();
        Assert.AreEqual(ex2, DivideOp.Create(4338722591, 1000000));
        var a                 = new Identifier("a");
        var one               = new One();
        var three             = Literal.Create(3);
        var four              = Literal.Create(4);
        var x                 = new Identifier("x");
        var twentyone         = Literal.Create(21);
        var two               = new Two();
        var five              = Literal.Create(5);
        var eleven            = Literal.Create(11);
        var sixteenPthirtyone = ExprParser.ParseOrThrow("16.31");
        var r                 = new Identifier("r");
        var fOfx              = Call.Create(new Identifier("f"), x);
        var expected          = ExprParser.ParseOrThrow(input);
        var actual            = (one - (a * (three - four) * x / twentyone)).Raise(three) - (one / two).Raise(five) + eleven - ((sixteenPthirtyone.Raise(three) - a) * r * fOfx).Simplify();

        Assert.AreEqual(expected.Simplify(), actual);
        Assert.AreEqual((a * r * fOfx) - (Literal.Create(4338722591) * r * fOfx / Literal.Create(1000000)) + (a.Raise(three) * x.Raise(three) / Literal.Create(9261)) + (a.Raise(two) * x.Raise(two) / Literal.Create(147)) + (a * x / Literal.Create(7)) + (Literal.Create(383) / Literal.Create(32)), actual);
    }
コード例 #16
0
    public void QuantityTwoMinus_a_raisedTo1DividedBy3Test()
    {
        var actual   = DivideOp.Create(PowerOp.Create(SubtractOp.Create(new Two(), new Identifier("a")), new One()), Literal.Create(3)).Simplify();
        var expected = ExprParser.ParseOrThrow("(2-a)^1/3").Simplify();

        Assert.AreEqual(expected, actual);
    }
コード例 #17
0
    public void ParseSciNotWithParenTest()
    {
        var f = ExprParser.ParseOrThrow("1.2340000E(4)");

        Assert.AreEqual(f, (new One() * Literal.Create(10000)) + Literal.Create(2340));
        Assert.AreEqual(f, Literal.Create(2340) + (Literal.Create(10000) * new One()));
    }
コード例 #18
0
    public void A_RaiseToQuantity1Plus2Test()
    {
        var actual   = new Identifier("a").Raise(new One() + new Two()).Simplify();
        var expected = ExprParser.ParseOrThrow("a^(1+2)").Simplify();

        Assert.AreEqual(expected.Simplify(), actual);
    }
コード例 #19
0
        public void ExpressionWithLogicTest(string text, int nexp)
        {
            var expr = ExprParser.Parse(text);

            Assert.IsNotNull(expr);
            Assert.AreEqual(nexp, expr.ExprEntries.Count);
        }
コード例 #20
0
    public void RaisedToNumberThenAddTest()
    {
        var actual = AddOp.Create(PowerOp.Create(A, One), Two);

        Assert.AreEqual(ExprParser.ParseOrThrow("a^1+2"), actual);
        Assert.AreEqual(A.Raise(One) + Two, actual.Simplify());
    }
コード例 #21
0
        public void TestNamedPlaceholders()
        {
            ExprParser parser = new ExprParser("a = :a and b = :b and (c = 'x' or d = :b)");

            Assert.Equal("IDENT(a)", parser.tokens[0].ToString());
            Assert.Equal("EQ", parser.tokens[1].ToString());
            Expr e = parser.Parse();

            Assert.Equal(0, parser.placeholderNameToPosition["a"]);
            Assert.Equal(1, parser.placeholderNameToPosition["b"]);
            Assert.Equal(2, parser.positionalPlaceholderCount);

            Expr aEqualsPlaceholder = e.Operator.Param[0].Operator.Param[0].Operator.Param[1];

            Assert.Equal(Expr.Types.Type.Placeholder, aEqualsPlaceholder.Type);
            Assert.Equal((uint)0, aEqualsPlaceholder.Position);
            Expr bEqualsPlaceholder = e.Operator.Param[0].Operator.Param[1].Operator.Param[1];

            Assert.Equal(Expr.Types.Type.Placeholder, bEqualsPlaceholder.Type);
            Assert.Equal((uint)1, bEqualsPlaceholder.Position);
            Expr dEqualsPlaceholder = e.Operator.Param[1].Operator.Param[1].Operator.Param[1];

            Assert.Equal(Expr.Types.Type.Placeholder, dEqualsPlaceholder.Type);
            Assert.Equal((uint)1, dEqualsPlaceholder.Position);
        }
コード例 #22
0
    public void TrailingZerosOnSciNo()
    {
        var f = ExprParser.ParseOrThrow("1.2340000E4");

        Assert.AreEqual(f, (new One() * Literal.Create(10000)) + Literal.Create(2340));
        Assert.AreEqual(f, Literal.Create(2340) + (Literal.Create(10000) * new One()));
    }
コード例 #23
0
        public void TestExprAsPathDocumentProjection()
        {
            List <Projection> projList = new ExprParser("$.a as b, (1 + 1) * 100 as x, 2 as j42").ParseDocumentProjection();

            Assert.Equal(3, projList.Count);

            // check $.a as b
            Projection proj = projList[0];
            IList <DocumentPathItem> paths = proj.Source.Identifier.DocumentPath;

            Assert.Equal(1, paths.Count);
            Assert.Equal(DocumentPathItem.Types.Type.Member, paths[0].Type);
            Assert.Equal("a", paths[0].Value);

            Assert.Equal("b", proj.Alias);

            // check (1 + 1) * 100 as x
            proj = projList[1];
            Assert.Equal("((1 + 1) * 100)", ExprUnparser.ExprToString(proj.Source));
            Assert.Equal("x", proj.Alias);

            // check 2 as j42
            proj = projList[2];
            Assert.Equal("2", ExprUnparser.ExprToString(proj.Source));
            Assert.Equal("j42", proj.Alias);
        }
コード例 #24
0
        //判斷是否一個 cond (條件判斷)
        static public bool IsCond(string line)
        {
            //首先得有個問號
            //first there has to be a question mark
            if (line.Contains('?'))
            {
                //以問題分隔開條件和語句
                string[] split = line.Split('?');
                string   tmp;

                //左手邊必須是合法條件式
                if (!ExprParser.TryParse(split[0], out tmp))
                {
                    return(false);
                }

                //右手邊的語句必須是一個合法的 multi (留 multi 也包含了所有次級的定義: decla, exec, basic)
                //lastly the right hand side has to be a multi
                if (IsMulti(line.Replace(split[0] + "?", "")))
                {
                    return(true);
                }
            }


            return(false);
        }
コード例 #25
0
        public void EmptyGroupsTest(string text, int grpn)
        {
            var expr = ExprParser.Parse(text);

            Assert.IsNotNull(expr);
            Assert.AreEqual(grpn, expr.ExprEntries.Count);
        }
コード例 #26
0
        public void EmptyStringTest(string text)
        {
            var expr = ExprParser.Parse(text);

            Assert.IsNotNull(expr);
            Assert.False(expr.ExprEntries.Any());
        }
コード例 #27
0
    public void BracketsTest()
    {
        var actual   = ExprParser.ParseOrThrow("1+[2+y]/{x*(y+4)}");
        var expected = new One() + (AddOp.Create(new Two(), new Identifier("y")) / MultiplyOp.Create(new Identifier("x"), AddOp.Create(4, new Identifier("y"))));

        Assert.AreEqual(expected, actual);
    }
コード例 #28
0
    public void FractionRaisedToNegative()
    {
        var expected = ExprParser.ParseOrThrow("(a/b)^-1");
        var actual   = DivideOp.Create(new Identifier("b"), new Identifier("a"));

        Assert.AreEqual(expected.Simplify(), actual);
    }
コード例 #29
0
        public void TestNumberedPlaceholders()
        {
            ExprParser parser = new ExprParser("a == :1 and b == :3 and (c == :2 or d == :2)");
            Expr       e      = parser.Parse();

            Assert.Equal(0, parser.placeholderNameToPosition["1"]);
            Assert.Equal(1, parser.placeholderNameToPosition["3"]);
            Assert.Equal(2, parser.placeholderNameToPosition["2"]);
            Assert.Equal(3, parser.positionalPlaceholderCount);

            Expr aEqualsPlaceholder = e.Operator.Param[0].Operator.Param[0].Operator.Param[1];

            Assert.Equal(Expr.Types.Type.Placeholder, aEqualsPlaceholder.Type);
            Assert.Equal((uint)0, aEqualsPlaceholder.Position);
            Expr bEqualsPlaceholder = e.Operator.Param[0].Operator.Param[1].Operator.Param[1];

            Assert.Equal(Expr.Types.Type.Placeholder, bEqualsPlaceholder.Type);
            Assert.Equal((uint)1, bEqualsPlaceholder.Position);
            Expr cEqualsPlaceholder = e.Operator.Param[1].Operator.Param[0].Operator.Param[1];

            Assert.Equal(Expr.Types.Type.Placeholder, cEqualsPlaceholder.Type);
            Assert.Equal((uint)2, cEqualsPlaceholder.Position);
            Expr dEqualsPlaceholder = e.Operator.Param[1].Operator.Param[1].Operator.Param[1];

            Assert.Equal(Expr.Types.Type.Placeholder, dEqualsPlaceholder.Type);
            Assert.Equal((uint)2, dEqualsPlaceholder.Position);
        }
コード例 #30
0
    public void TwoMinus_a_PowerOf1Test()
    {
        var actual   = SubtractOp.Create(new Two(), PowerOp.Create(new Identifier("a"), new One()));
        var expected = ExprParser.ParseOrThrow("2-a^1");

        Assert.AreEqual(expected, actual);
    }
コード例 #31
0
ファイル: Program.cs プロジェクト: ricardoborges/ANTLR-Lab
        static void Main(string[] args)
        {
            var input = new ANTLRStringStream("a=(3+4)*5\r\na+1\r\n");
            var lexer = new ExprLexer(input);
            var tokens = new CommonTokenStream(lexer);
            var parser = new ExprParser(tokens);

            parser.prog();
        }
コード例 #32
0
ファイル: Program.cs プロジェクト: adbrowne/abcm
        static void Main(string[] args)
        {
            using (var stardardInput = Console.OpenStandardInput())
            {
                ANTLRInputStream input = new ANTLRInputStream(stardardInput);
                ExprLexer lexer = new ExprLexer(input);
                CommonTokenStream tokens = new CommonTokenStream(lexer);
                ExprParser parser = new ExprParser(tokens);
                parser.prog();
            }

            Console.ReadKey();
        }
コード例 #33
0
ファイル: Main.cs プロジェクト: GHScan/DailyProjects
 public static void Main(string[] args)
 {
     try
     {
         ICharStream input = new ANTLRReaderStream(System.Console.In);
         ExprLexer lexer = new ExprLexer(input);
         CommonTokenStream tokens = new CommonTokenStream(lexer);
         ExprParser parser = new ExprParser(tokens);
         parser.prog();
     }
     catch (System.Exception e)
     {
         Console.Error.WriteLine("exception: " + e);
         Console.Error.WriteLine(e.StackTrace);
     }
 }
コード例 #34
0
ファイル: Main.cs プロジェクト: BackupTheBerlios/ccl-plugin
    public static void Main(string[] args)
    {
        try {
            ExprLexer lexer = new ExprLexer(new CharBuffer(Console.In));
            ExprParser parser = new ExprParser(lexer);

            // set the type of tree node to create; this is default action
            // so it is unnecessary to do it here, but demos capability.
            parser.setASTNodeClass("antlr.CommonAST");

            parser.expr();
            antlr.CommonAST ast = (antlr.CommonAST)parser.getAST();
            if (ast != null) {
                Console.Out.WriteLine(ast.ToStringList());
            } else {
                Console.Out.WriteLine("null AST");
            }
        } catch(Exception e) {
            Console.Error.WriteLine("exception: "+e);
        }
    }