private TreeNode C() { var now = myLexer.Current; switch (now.Type) { case Type.NOT: { var list = new List <TreeNode> { new Not() }; myLexer.MoveNext(); list.Add(C()); return(new Rule(list, nameof(C))); } case Type.LPAREN: { var list = new List <TreeNode> { new Parenthesis(now.Value) }; myLexer.MoveNext(); list.Add(S()); list.Add(new Parenthesis(')')); myLexer.MoveNext(); return(new Rule(list, nameof(C))); } case Type.VAR: { var list = new List <TreeNode> { new Terminal(now) }; myLexer.MoveNext(); return(new Rule(list, nameof(C))); } default: throw new ParseException(myLexer.Pos); } }