// _____________________________ // <value> : Literal|<function-invokation> private GrammarNonTerminalBody ParseNonTerminalBody(ref LexerStringReader reader, GrammarNonTerminal nonTerminal) { var body = new GrammarNonTerminalBody(); var bodyString = new string(reader.ReadTillNewLine()); while (!reader.IsEndOfQuery()) { reader.ReadTillEndOfWhitespace(); if (reader.CurrentChar != OrSeparator && reader.CurrentChar != Assign) { break; } bodyString += new string(reader.ReadTillNewLine()); } var orConditions = bodyString.Split(OrSeparator, StringSplitOptions.RemoveEmptyEntries); foreach (var operandSplitItem in orConditions) { var operand = new GrammarNonTerminalBody.OrConditionOperand(); var blockItems = operandSplitItem.Split(' ', StringSplitOptions.RemoveEmptyEntries); foreach (var blockItem in blockItems) { var bodyItem = ParseNonTerminalBodyItem(blockItem.Trim()); if (bodyItem is GrammarNonTerminalUsage nonTerminalUsage && ReferenceEquals(nonTerminal, nonTerminalUsage.Impl)) { operand.IsRecursive = true; } operand.Add(bodyItem); } body.OrConditionOperands.Add(operand); } return(body); }
public GrammarNonTerminalUsage(string name, GrammarNonTerminal impl) { Name = name; Impl = impl; }