protected override object OnRuleExpression(INonterminalToken token) { if (token == null) { throw new ArgumentNullException(nameof(token)); } var expression = Visit <IExpression>(token[0]); var children = token.Nonterminal(1).Children; if (children.Count > 0) { var expressions = new List <IExpression> { expression }; foreach (var child in children) { expressions.Add(Visit <IExpression>(child)); } expression = new Alternates(expressions); } return(expression); }
public void Dump(INonterminalToken token) { var iwriter = new IndentWriter(" "); Dump(iwriter, token); iwriter.Persist(File); }
protected override object OnRange(INonterminalToken token) { if (token == null) { throw new ArgumentNullException(nameof(token)); } throw new NotSupportedException(); }
protected override object OnTerminalOption(INonterminalToken token) { if (token == null) { throw new ArgumentNullException(nameof(token)); } return(Repeat.Optional(Visit <IExpression>(token[0]))); }
protected override object OnTerminalDiff(INonterminalToken token) { if (token == null) { throw new ArgumentNullException(nameof(token)); } return(new Difference(Visit <IExpression>(token[0]), Visit <IExpression>(token[1]))); }
protected override object OnCharacterRange(INonterminalToken token) { if (token == null) { throw new ArgumentNullException(nameof(token)); } return(new Tree.Range(Visit <IExpression>(token[0]), Visit <IExpression>(token[1]))); }
protected override object OnSubRule(INonterminalToken token) { if (token == null) { throw new ArgumentNullException(nameof(token)); } return(new SubRule(Visit <Name>(token[0]), Visit <IExpression>(token[1]))); }
protected override object OnOption(INonterminalToken token) { if (token == null) { throw new ArgumentNullException(nameof(token)); } return(new Option(token.Terminal(0).Value, token.Terminal(1).Value)); }
protected override object OnGrammarRules(INonterminalToken token) { if (token == null) { throw new ArgumentNullException(nameof(token)); } return(token.Nonterminal(0).Children.Select(Visit <NonterminalRule>).ToArray()); }
protected override object OnRule(INonterminalToken token) { if (token == null) { throw new ArgumentNullException(nameof(token)); } return(NonterminalRule.From(token.Terminal(0).Value, false, Visit <IExpression>(token[1]))); }
protected override object OnFile(INonterminalToken token) { if (token == null) { throw new ArgumentNullException(nameof(token)); } return(Visit <RawGrammar>(token[0])); }
protected override object OnRuleSequence(INonterminalToken token) { var children = token.Nonterminal(0).Children; var expressions = children.Select(Visit <IExpression>).ToArray(); if (expressions.Length > 1) { return(new Sequence(expressions)); } return(expressions[0]); }
public IEnumerable <(int from, int to, string id)> Visit(INonterminalToken root) { foreach (var preData in ((INonterminalToken)root[0]).Children.Where(x => x.Symbol.Id == UcdBlocksId.Data).Cast <INonterminalToken>()) { if (preData.Symbol.Id == UcdBlocksId.Data) { var begin = int.Parse(preData.Nonterminal(0).Terminal(0).Value, NumberStyles.HexNumber); var end = int.Parse(preData.Nonterminal(0).Terminal(1).Value, NumberStyles.HexNumber); var id = preData.Terminal(1).Value; yield return(begin, end, id); } } }
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); }
protected override object OnTerminalSequence(INonterminalToken token) { if (token == null) { throw new ArgumentNullException(nameof(token)); } var children = token.Nonterminal(0).Children; var expressions = children.Select(Visit <IExpression>).ToArray(); if (expressions.Length > 1) { return(new Sequence(expressions)); } return(expressions[0]); }
protected override object OnTerminalExpression(INonterminalToken token) { var expressions = new List <IExpression>() { Visit <IExpression>(token[0]) }; var children = token.Nonterminal(1).Children; expressions.AddRange(children.Select(Visit <IExpression>)); if (expressions.Count > 1) { return(new Alternates(expressions)); } return(expressions[0]); }
protected override object OnTerminalRangeLoop(INonterminalToken token) { var expression = Visit <IExpression>(token[0]); var range = token.Nonterminal(1).Children; var x1 = Visit <Integer>(range[0]); var rest = ((INonterminalToken)range[1]).Children; if (rest.Count == 0) { return(Repeat.From(expression, x1.Value, x1.Value)); } var x2 = Visit <Integer>(rest[0]); return(Repeat.From(expression, x1.Value, x2.Value)); }
protected override object OnRuleOption(INonterminalToken token) { Debug.Assert(token.Count == 1); return(Repeat.Optional(Visit <IExpression>(token[0]))); }
protected override object OnTerminalOption(INonterminalToken token) { return(Repeat.Optional(Visit <IExpression>(token[0]))); }
protected override object OnFile(INonterminalToken token) { return(Visit <RawGrammar>(token[0])); }
protected override object OnTerminalDiff(INonterminalToken token) { return(new Difference(Visit <IExpression>(token[0]), Visit <IExpression>(token[1]))); }
protected override object OnCharacterRange(INonterminalToken token) { return(new Tree.Range(Visit <IExpression>(token[0]), Visit <IExpression>(token[1]))); }
protected override object OnGrammarRules(INonterminalToken token) { return(token.Nonterminal(0).Children.Select(Visit <NonterminalRule>).ToArray()); }
protected override object OnSubRule(INonterminalToken token) { return(new SubRule(Visit <Name>(token[0]), Visit <IExpression>(token[1]))); }
protected override object OnRange(INonterminalToken token) { throw new NotSupportedException(); }
public RawGrammar Visit(INonterminalToken root) { return(Visit <RawGrammar>(root)); }
protected override object OnRule(INonterminalToken token) { return(NonterminalRule.From(token.Terminal(0).Value, false, Visit <IExpression>(token[1]))); }
protected override T OnStart(INonterminalToken token) { Debug.Assert(token != null); return(DefaultOn(token)); }
protected abstract T OnStart(INonterminalToken token);
protected override object OnOption(INonterminalToken token) { return(new Option(token.Terminal(0).Value, token.Terminal(1).Value)); }