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); }
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); }
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); }
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); }
public void InitParser() { _tokenNode = new TokenNode("Root"); Parse(0, _tokenNode); }