Mercurial > pub > ImplabNet
comparison Implab/Formats/Grammar.cs @ 228:6fa235c5a760 v2
Rewritten JsonScanner, JsonParser, fixed naming style
author | cin |
---|---|
date | Tue, 12 Sep 2017 01:19:12 +0300 |
parents | d5c5db0335ee |
children | 302ca905c19e |
comparison
equal
deleted
inserted
replaced
227:8d5de4eb9c2c | 228:6fa235c5a760 |
---|---|
65 protected Token SymbolTokenExcept(IEnumerable<TSymbol> symbols) { | 65 protected Token SymbolTokenExcept(IEnumerable<TSymbol> symbols) { |
66 Safe.ArgumentNotNull(symbols, "symbols"); | 66 Safe.ArgumentNotNull(symbols, "symbols"); |
67 | 67 |
68 return Token.New( Enumerable.Range(0, AlphabetBuilder.Count).Except(TranslateOrDie(symbols)).ToArray() ); | 68 return Token.New( Enumerable.Range(0, AlphabetBuilder.Count).Except(TranslateOrDie(symbols)).ToArray() ); |
69 } | 69 } |
70 | |
71 protected abstract IndexedAlphabetBase<TSymbol> CreateAlphabet(); | |
72 | |
73 protected ScannerContext<TTag> BuildScannerContext<TTag>(Token regexp) { | |
74 | |
75 var dfa = new RegularDFA<TSymbol, TTag>(AlphabetBuilder); | |
76 | |
77 var visitor = new RegularExpressionVisitor<TTag>(dfa); | |
78 regexp.Accept(visitor); | |
79 visitor.BuildDFA(); | |
80 | |
81 if (dfa.IsFinalState(dfa.InitialState)) | |
82 throw new ApplicationException("The specified language contains empty token"); | |
83 | |
84 var ab = CreateAlphabet(); | |
85 var optimal = dfa.Optimize(ab); | |
86 | |
87 return new ScannerContext<TTag>( | |
88 optimal.CreateTransitionTable(), | |
89 optimal.CreateFinalStateTable(), | |
90 optimal.CreateTagTable(), | |
91 optimal.InitialState, | |
92 ab.GetTranslationMap() | |
93 ); | |
94 } | |
95 | |
96 } | 70 } |
97 | 71 |
98 | 72 |
99 } | 73 } |