private TreeNode ParseOr() { var head = ParseCat(); while (PeekAndDiscard('|')) { var tail = ParseCat(); head = new TreeNode { Type = NodeType.Or, Left = head, Right = tail, }; } return head; }
public TreeNode Parse() { var head = ParseOr(); if (PeekAndDiscard(']')) { Expect('['); var tail = ParseOr(); head = new TreeNode { Type = NodeType.Cut, Left = head, Right = tail }; } return head; }
private TreeNode ParseCat() { var prev = ParseFactor(); for (; ; ) { var tail = ParseFactor(); if (tail == null) break; var node = new TreeNode { Type = NodeType.Cat, Left = prev, Right = tail }; prev = node; } return prev; }