protected override object OnVariableCfGrammar(ASTNode node) { var name = VisitChild <Name>(node, 0); var grammar = new RawGrammar(name.Text); foreach (var subNode in node.Children.Skip(1)) { if (subNode.Symbol.ID == LinguParser.ID.VariableGrammarOptions) { grammar.Options.AddRange(VisitChildren <Option>(subNode)); } if (subNode.Symbol.ID == LinguParser.ID.VariableGrammarTerminals) { grammar.Terminals.AddRange(VisitChildren <TerminalRule>(subNode)); } if (subNode.Symbol.ID == LinguParser.ID.VariableGrammarRules) { grammar.Nonterminals.AddRange(VisitChildren <NonterminalRule>(subNode)); } } return(grammar); }
protected override object OnGrammar(INonterminalToken token) { Debug.Assert(token[0].Symbol.Id == LinguId.Identifier); var grammar = new RawGrammar(token.Terminal(0).Value); foreach (var section in token.Nonterminal(1).Children) { var children = Visit <IReadOnlyList <Symbol> >(section); grammar.Options.AddRange(children.OfType <Option>()); grammar.Terminals.AddRange(children.OfType <TerminalRule>()); grammar.Nonterminals.AddRange(children.OfType <NonterminalRule>()); } return(grammar); }
public NonterminalBuilder(BuildGrammar buildGrammar, RawGrammar rawGrammar) { BuildGrammar = buildGrammar; RawGrammar = rawGrammar; ToDo = new Queue <(Nonterminal, IEnumerable <IExpression>)>(); }
public TerminalBuilder(BuildGrammar buildGrammar, RawGrammar rawGrammar) { BuildGrammar = buildGrammar; RawGrammar = rawGrammar; }
public GrammarBuilder(RawGrammar tree) { RawGrammar = tree; BuildGrammar = new BuildGrammar(RawGrammar.Name); }