Пример #1
0
        //           _____________________________
        // <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;
 }