예제 #1
0
    private static void NT_Alternative(ref Rule rule)
    {
        String nonterminal = "";
                String terminal = "";

                Alternative alternative = new Alternative();

                Rule groupRule = null;
                Rule optionalRule = null;
                Rule repetitionRule = null;

        for (;;) {
          switch (Syn.Interpret()) {
        case 0:
          return;
        case 1: // SEM
          rule.AddAlternative(alternative);

          break;
        case 2:
          Lex.GETnonterminalAttr(out nonterminal);
          break;
        case 3: // SEM
          alternative.AddSymbol(new Symbol(nonterminal, Symbol.Kind.NONTERMINAL));

          break;
        case 4:
          Lex.GETterminalAttr(out terminal);
          break;
        case 5: // SEM
          alternative.AddSymbol(new Symbol(terminal, Symbol.Kind.TERMINAL));

          break;
        case 6: // SEM
          groupRule = new Rule();
          					groupRule.NonTerminal = symbolNameGenerator.Generate();
          					rules.Add(groupRule);
          					alternative.AddSymbol(new Symbol(groupRule.NonTerminal, Symbol.Kind.NONTERMINAL));

          break;
        case 7:
          NT_Grouping(ref groupRule);
          break;
        case 8: // SEM
          optionalRule = new Rule();
          					optionalRule.NonTerminal = symbolNameGenerator.Generate();

          					// add empty alternative
          					optionalRule.AddAlternative(new Alternative());

          					rules.Add(optionalRule);
          					alternative.AddSymbol(new Symbol(optionalRule.NonTerminal, Symbol.Kind.NONTERMINAL));

          break;
        case 9:
          NT_Optional(ref optionalRule);
          break;
        case 10: // SEM
          repetitionRule = new Rule();
          					repetitionRule.NonTerminal = symbolNameGenerator.Generate();

          					rules.Add(repetitionRule);
          					alternative.AddSymbol(new Symbol(repetitionRule.NonTerminal, Symbol.Kind.NONTERMINAL));

          break;
        case 11:
          NT_Repetition(ref repetitionRule);
          break;
        case 12: // SEM
          // add recursion to every alternative
          					foreach (Alternative a in repetitionRule.GetAlternatives()) {
          						a.AddSymbol(new Symbol(repetitionRule.NonTerminal, Symbol.Kind.NONTERMINAL));
          					}

          					// add empty alternative
          					repetitionRule.AddAlternative(new Alternative());

          break;
          } // switch
        } // for
    }
예제 #2
0
    }         // NT_Alternatives

    private static void NT_Alternative(ref Rule rule)
    {
        String nonterminal = "";
        String terminal    = "";

        Alternative alternative = new Alternative();

        Rule groupRule      = null;
        Rule optionalRule   = null;
        Rule repetitionRule = null;

        for (;;)
        {
            switch (Syn.Interpret())
            {
            case 0:
                return;

            case 1: // SEM
                rule.AddAlternative(alternative);

                break;

            case 2:
                Lex.GETnonterminalAttr(out nonterminal);
                break;

            case 3: // SEM
                alternative.AddSymbol(new Symbol(nonterminal, Symbol.Kind.NONTERMINAL));

                break;

            case 4:
                Lex.GETterminalAttr(out terminal);
                break;

            case 5: // SEM
                alternative.AddSymbol(new Symbol(terminal, Symbol.Kind.TERMINAL));

                break;

            case 6: // SEM
                groupRule             = new Rule();
                groupRule.NonTerminal = symbolNameGenerator.Generate();
                rules.Add(groupRule);
                alternative.AddSymbol(new Symbol(groupRule.NonTerminal, Symbol.Kind.NONTERMINAL));

                break;

            case 7:
                NT_Grouping(ref groupRule);
                break;

            case 8: // SEM
                optionalRule             = new Rule();
                optionalRule.NonTerminal = symbolNameGenerator.Generate();

                // add empty alternative
                optionalRule.AddAlternative(new Alternative());

                rules.Add(optionalRule);
                alternative.AddSymbol(new Symbol(optionalRule.NonTerminal, Symbol.Kind.NONTERMINAL));

                break;

            case 9:
                NT_Optional(ref optionalRule);
                break;

            case 10: // SEM
                repetitionRule             = new Rule();
                repetitionRule.NonTerminal = symbolNameGenerator.Generate();

                rules.Add(repetitionRule);
                alternative.AddSymbol(new Symbol(repetitionRule.NonTerminal, Symbol.Kind.NONTERMINAL));

                break;

            case 11:
                NT_Repetition(ref repetitionRule);
                break;

            case 12: // SEM
                // add recursion to every alternative
                foreach (Alternative a in repetitionRule.GetAlternatives())
                {
                    a.AddSymbol(new Symbol(repetitionRule.NonTerminal, Symbol.Kind.NONTERMINAL));
                }

                // add empty alternative
                repetitionRule.AddAlternative(new Alternative());

                break;
            } // switch
        }     // for
    }         // NT_Alternative