public Transformation(string expression, string filter, string result) { ExpressionText = expression; FilterText = filter; ResultText = result; TokenizedExpression = Tokenizer.Parse(ExpressionText); TokenizedFilter = Tokenizer.Parse(FilterText); TokenizedResult = Tokenizer.Parse(ResultText); InstructionTree = InstructionParser.Parse(TokenizedExpression); ResultInstructionTree = ResultParser.Parse(TokenizedResult); Filters = FilterParser.ParseAll(TokenizedFilter); LabelSet = new LabelSet(InstructionTree); LabelSet.AddUse(ResultInstructionTree); }
private static (InstructionNode node, int end, int nodeNbr) ParseInstructionNode(List <Token> tokens, int start, int nodeNbr) { var node = new InstructionNode() { NodeNbr = nodeNbr }; var length = tokens.Count; for (int index = start; index < length; index++) { var token = tokens[index]; if (token.TokenType == TokenType.OpenParens) { if (node.InstructionName == null) { index++; node.InstructionName = tokens[index].Value; } else { var childNode = ParseInstructionNode(tokens, index, nodeNbr + 1); index = childNode.end; nodeNbr = childNode.nodeNbr; node.Operands.Add(new Operand(childNode.node, node.Operands.Count)); } } else if (token.TokenType == TokenType.CloseParens) { return(node, index, nodeNbr); } else if (token.TokenType == TokenType.Word) { node.Operands.Add(new Operand(new Token(TokenType.Label, token.Position, token.Value), node.Operands.Count)); } else if (token.TokenType == TokenType.IntegerConstant) { node.Operands.Add(new Operand(token, node.Operands.Count)); } else if (token.TokenType == TokenType.DoubleConstant) { node.Operands.Add(new Operand(token, node.Operands.Count)); } else if (token.TokenType == TokenType.FloatConstant) { node.Operands.Add(new Operand(token, node.Operands.Count)); } else if (token.TokenType == TokenType.Underscore) { node.Operands.Add(new Operand(token, node.Operands.Count)); } else if (token.TokenType == TokenType.OpenCurly) { index++; // skip to next token, which should be label node.Conditions = InstructionParser.ParseConditions(tokens, ref index); node.Condition = node.Conditions[0]; } else { throw new Exception($"parsing error {token}"); } } throw new Exception($"parsing error incomplete"); }