private void ParseOnePass(HashQueue work, List<List<ParseNode>> output) { List<ParseNode> input = work.Dequeue(); for (int i = 0; i < input.Count; i++) { ParseNode l = input[i]; ParseNode r = i + 1 < input.Count ? input[i + 1] : ParseNode.EmptyParseNode(); foreach (GrammarDefinition rule in Rules) { int modify = 0; if (rule.Right == SyntaxCategories.SYNTAX_CATEGORY_EMPTY) { if (rule.Left == l.Type) { modify = 1; } } else { if (rule.Left == l.Type && rule.Right == r.Type) { modify = 2; } } if (modify > 0) { List<ParseNode> modifiedInput = input.GetRange(0, input.Count); modifiedInput.RemoveRange(i, modify); ParseNode parent = new ParseNode(rule.Parent, null, l, modify > 1 ? r : ParseNode.EmptyParseNode()); modifiedInput.Insert(i, parent); if (modifiedInput.Count == 1 && modifiedInput[0].Type == SyntaxCategories.SYNTAX_CATEGORY_FULL) output.Add(modifiedInput); else work.Enqueue(modifiedInput); } } } }
public static ParseNode EmptyParseNode() { if (_empty == null) _empty = new ParseNode(SyntaxCategories.SYNTAX_CATEGORY_EMPTY, null); return _empty; }
private void ParseRecurse(List<ParseNode> input, List<List<ParseNode>> output) { for (int i = 0; i < input.Count; i++) { ParseNode l = input[i]; ParseNode r = i + 1 < input.Count ? input[i + 1] : ParseNode.EmptyParseNode(); foreach (GrammarDefinition rule in Rules) { if (rule.Right == SyntaxCategories.SYNTAX_CATEGORY_EMPTY) { if (rule.Left == l.Type) { List<ParseNode> modifiedInput = input.GetRange(0, input.Count); modifiedInput.RemoveRange(i, 1); ParseNode parent = new ParseNode(rule.Parent, null, l, ParseNode.EmptyParseNode()); modifiedInput.Insert(i, parent); ParseRecurse(modifiedInput, output); } } else { if (rule.Left == l.Type && rule.Right == r.Type) { List<ParseNode> modifiedInput = input.GetRange(0, input.Count); modifiedInput.RemoveRange(i, 2); ParseNode parent = new ParseNode(rule.Parent, null, l, r); modifiedInput.Insert(i, parent); ParseRecurse(modifiedInput, output); } } } } if (input.Count == 1 && input[0].Type == SyntaxCategories.SYNTAX_CATEGORY_FULL) { output.Add(input); } }
public ParseNode(int u, string term, ParseNode l, ParseNode r) : this(u, term) { Left = l; Right = r; }