Пример #1
0
        public string GenerateCode()
        {
            if (_tokenNode == null)
            {
                _tokenNode = new TokenNode("Root");
            }

            Code = CreateExpression(_tokenNode);

            var x     = 0;
            var ascii = "";
            var outs  = "";

            for (var j = 0; j < Code.Length; j++)
            {
                x++;

                if (x == 17)
                {
                    x     = 1;
                    outs += string.Format("{0}\n{1}\t", ascii, j.ToString("X"));
                    ascii = "";
                }

                var n = Code[j];

                if (n > 15)
                {
                    outs += n.ToString("X") + " ";
                }
                else
                {
                    outs += "0" + n.ToString("X") + " ";
                }

                if (n > 31)
                {
                    ascii += (char)n;
                }
                else
                {
                    ascii += ".";
                }
            }

            if (x == 16)
            {
                outs += ascii;
            }
            else
            {
                for (var j = 0; j < 16 - x; j++)
                {
                    outs += "   ";
                }

                outs += ascii;
            }

            return(outs);
        }
Пример #2
0
        public byte[] CreateExpression(TokenNode node = null)
        {
            if (node == null)
            {
                node = _tokenNode;
            }

            var result = new byte[0];

            if (node.Text == "Root")
            {
                var n1 = node.Nodes[0];

                switch (n1.Text)
                {
                case "expr":
                {
                    result = CreateExpression(n1);

                    break;
                }

                case "bool":
                {
                    result = CreateBool(n1);

                    break;
                }

                case "plot bool":
                {
                    result = CreatePlotBool(n1);

                    break;
                }

                case "plot int":
                {
                    result = CreatePlotInt(n1);

                    break;
                }
                }
            }

            if (node.Text != "expr")
            {
                return(result);
            }

            var n = node.Nodes.Count;

            if (n < 3)
            {
                return(result);
            }

            var compare = node.Nodes[1].Text;
            var bytes   = new List <byte[]>();

            for (var i = 0; i < (n - 1) / 2; i++)
            {
                switch (node.Nodes[i * 2].Text)
                {
                case "bool":
                {
                    bytes.Add(CreateBool(node.Nodes[i * 2]));

                    break;
                }

                case "expr":
                {
                    bytes.Add(CreateExpression(node.Nodes[i * 2]));

                    break;
                }

                case "Function":
                {
                    bytes.Add(CreateFunction(node.Nodes[i * 2]));

                    break;
                }

                case "plot bool":
                {
                    bytes.Add(CreatePlotBool(node.Nodes[i * 2]));

                    break;
                }

                case "plot int":
                {
                    bytes.Add(CreatePlotInt(node.Nodes[i * 2]));

                    break;
                }

                case "value":
                {
                    bytes.Add(CreateValue(node.Nodes[i * 2]));

                    break;
                }
                }

                if (node.Nodes[i * 2 + 1].Text != compare)
                {
                    return(result);
                }
            }

            var negExp = false;

            switch (node.Nodes[n - 1].Text)
            {
            case "bool":
            {
                bytes.Add(CreateBool(node.Nodes[n - 1]));

                break;
            }

            case "expr":
            {
                bytes.Add(CreateExpression(node.Nodes[n - 1]));

                break;
            }

            case "true":
            {
                bytes.Add(new byte[] { 0, 1 });

                break;
            }

            case "false":
            {
                bytes.Add(new byte[] { 0, 0 });
                negExp = true;

                break;
            }

            case "plot bool":
            {
                bytes.Add(CreatePlotBool(node.Nodes[n - 1]));

                break;
            }

            case "plot int":
            {
                bytes.Add(CreatePlotInt(node.Nodes[n - 1]));

                break;
            }

            case "value":
            {
                bytes.Add(CreateValue(node.Nodes[n - 1]));

                break;
            }
            }

            var size = bytes.Count * 2 + 4 + bytes.Sum(t => t.Length);

            result    = new byte[size];
            result[0] = 0x50;

            switch (compare)
            {
            case "&&":
            {
                result[1] = 4;

                break;
            }

            case "||":
            {
                result[1] = 5;

                break;
            }

            case "==":
            {
                result[1] = 7;

                break;
            }

            case "!=":
            {
                result[1] = 8;

                break;
            }

            case "<":
            {
                result[1] = 9;

                break;
            }

            case "<=":
            {
                result[1] = 10;

                break;
            }

            case ">":
            {
                result[1] = 11;

                break;
            }

            case ">=":
            {
                result[1] = 12;

                break;
            }
            }

            if (negExp)
            {
                result[1] = 6;
            }

            var hsize = (short)(bytes.Count * 2);
            var count = BitConverter.GetBytes((short)bytes.Count);

            result[2] = count[0];
            result[3] = count[1];

            for (var i = 0; i < bytes.Count; i++)
            {
                var buff = BitConverter.GetBytes(hsize);

                result[i * 2 + 4] = buff[0];
                result[i * 2 + 5] = buff[1];
                hsize            += (short)bytes[i].Length;
            }

            hsize = (short)(bytes.Count * 2 + 4);

            foreach (var t in bytes)
            {
                for (var j = 0; j < t.Length; j++)
                {
                    result[hsize + j] = t[j];
                }

                hsize += (short)t.Length;
            }

            return(result);
        }
Пример #3
0
        public int Parse(int pos = 0, TokenNode node = null)
        {
            var count = _tokens.Count;

            //if (pos >= (count - 1))
            if (pos >= (count))
            {
                return(0);
            }

            var token = _tokens[pos];

            switch (token.Type)
            {
            case TokenType.Symbol:
            {
                if (token.Value == "(")
                {
                    var node2 = new TokenNode("expr");

                    if (node != null)
                    {
                        node.Nodes.Add(node2);

                        return(ReadExpression(pos, node2));
                    }
                }

                break;
            }

            case TokenType.Word:
            {
                if (token.Value.Equals("bool", _stringComparison))
                {
                    ReadBool(pos, node);

                    return(2);
                }

                if (token.Value.Equals("plot", _stringComparison))
                {
                    ReadPlot(pos, node);

                    return(2);
                }

                if ((token.Value.Equals("true", _stringComparison)) ||
                    (token.Value.Equals("false", _stringComparison)))
                {
                    ReadBool(pos, node);

                    return(2);
                }

                break;
            }
            }

            return(0);
        }
Пример #4
0
        public int ReadExpression(int pos, TokenNode node)
        {
            var count = _tokens.Count;

            if (pos >= (count - 1))
            {
                return(0);
            }

            var currentPos = pos + 1;
            var token      = _tokens[currentPos];

            while (token.Value != ")")
            {
                switch (token.Type)
                {
                case TokenType.Symbol:
                {
                    if (token.Value == "(")
                    {
                        var n1 = new TokenNode("expr");

                        node.Nodes.Add(n1);

                        var n = ReadExpression(currentPos, n1);

                        currentPos += n;
                    }
                    else if (token.Value == "-")
                    {
                        var token2 = _tokens[currentPos + 1];

                        if (token2.Type == TokenType.Value)
                        {
                            var n1 = new TokenNode("value");

                            n1.Nodes.Add("-" + token2.Value);
                            node.Nodes.Add(n1);

                            currentPos += 2;
                        }
                    }
                    else
                    {
                        var n1 = new TokenNode(token.Value);

                        node.Nodes.Add(n1);

                        currentPos++;
                    }

                    break;
                }

                case TokenType.Unknown:
                {
                    return(0);
                }

                case TokenType.Value:
                {
                    var n1 = new TokenNode("value");

                    n1.Nodes.Add(token.Value);
                    node.Nodes.Add(n1);
                    currentPos++;

                    break;
                }

                case TokenType.Word:
                {
                    if (token.Value.Equals("plot", _stringComparison))
                    {
                        var n = ReadPlot(currentPos, node);
                        currentPos += n;
                    }

                    if (token.Value.Equals("bool", _stringComparison))
                    {
                        var n = ReadBool(currentPos, node);
                        currentPos += n;
                    }

                    if (token.Value.Equals("function", _stringComparison))
                    {
                        var n = ReadFunction(currentPos, node);
                        currentPos += n;
                    }

                    if (token.Value.Equals("true", _stringComparison))
                    {
                        var n1 = new TokenNode("bool");
                        var n2 = new TokenNode("true");

                        n1.Nodes.Add(n2);
                        node.Nodes.Add(n1);
                        currentPos++;
                    }

                    if (token.Value.Equals("false", _stringComparison))
                    {
                        var n1 = new TokenNode("bool");
                        var n2 = new TokenNode("false");

                        n1.Nodes.Add(n2);
                        node.Nodes.Add(n1);

                        node.Nodes.Add(n1);
                        currentPos++;
                    }

                    break;
                }

                default:
                {
                    break;
                }
                }

                token = _tokens[currentPos];
            }

            return(currentPos - pos + 1);
        }
Пример #5
0
        public void InitParser()
        {
            _tokenNode = new TokenNode("Root");

            Parse(0, _tokenNode);
        }