Mercurial > pub > ImplabNet
comparison Implab/Formats/JSON/JSONGrammar.cs @ 180:c32688129f14 ref20160224
refactoring complete, JSONParser rewritten
| author | cin |
|---|---|
| date | Thu, 24 Mar 2016 02:30:46 +0300 |
| parents | d5c5db0335ee |
| children | b2b6a6640aa3 |
comparison
equal
deleted
inserted
replaced
| 179:478ef706906a | 180:c32688129f14 |
|---|---|
| 1 using System.Linq; | 1 using System.Linq; |
| 2 using Implab.Automaton.RegularExpressions; | 2 using Implab.Automaton.RegularExpressions; |
| 3 using System; | 3 using System; |
| 4 using Implab.Automaton; | 4 using Implab.Automaton; |
| 5 using Implab.Components; | |
| 5 | 6 |
| 6 namespace Implab.Formats.JSON { | 7 namespace Implab.Formats.JSON { |
| 7 class JSONGrammar : Grammar<char> { | 8 class JSONGrammar : Grammar<char> { |
| 8 public enum TokenType { | 9 public enum TokenType { |
| 9 None, | 10 None, |
| 21 EscapedChar, | 22 EscapedChar, |
| 22 UnescapedChar, | 23 UnescapedChar, |
| 23 EscapedUnicode | 24 EscapedUnicode |
| 24 } | 25 } |
| 25 | 26 |
| 26 static Lazy<JSONGrammar> _instance = new Lazy<JSONGrammar>(); | 27 static LazyAndWeak<JSONGrammar> _instance = new LazyAndWeak<JSONGrammar>(() => new JSONGrammar()); |
| 27 | 28 |
| 28 public static JSONGrammar Instance { | 29 public static JSONGrammar Instance { |
| 29 get { return _instance.Value; } | 30 get { return _instance.Value; } |
| 30 } | 31 } |
| 31 | 32 |
| 32 readonly ScannerContext<TokenType> m_jsonExpression; | 33 readonly ScannerContext<TokenType> m_jsonExpression; |
| 33 readonly ScannerContext<TokenType> m_stringExpression; | 34 readonly ScannerContext<TokenType> m_stringExpression; |
| 35 readonly CharAlphabet m_defaultAlphabet = new CharAlphabet(); | |
| 34 | 36 |
| 35 public JSONGrammar() { | 37 public JSONGrammar() { |
| 36 DefineAlphabet(Enumerable.Range(0, 0x20).Select(x => (char)x)); | 38 DefineAlphabet(Enumerable.Range(0, 0x20).Select(x => (char)x)); |
| 37 var hexDigit = SymbolRangeToken('a','f').Or(SymbolRangeToken('A','F')).Or(SymbolRangeToken('0','9')); | 39 var hexDigit = SymbolRangeToken('a','f').Or(SymbolRangeToken('A','F')).Or(SymbolRangeToken('0','9')); |
| 38 var digit9 = SymbolRangeToken('1', '9'); | 40 var digit9 = SymbolRangeToken('1', '9'); |
| 85 m_stringExpression = BuildScannerContext<TokenType>(jsonStringExpression); | 87 m_stringExpression = BuildScannerContext<TokenType>(jsonStringExpression); |
| 86 | 88 |
| 87 | 89 |
| 88 } | 90 } |
| 89 | 91 |
| 92 protected override IAlphabetBuilder<char> AlphabetBuilder { | |
| 93 get { | |
| 94 return m_defaultAlphabet; | |
| 95 } | |
| 96 } | |
| 97 | |
| 90 public ScannerContext<TokenType> JsonExpression { | 98 public ScannerContext<TokenType> JsonExpression { |
| 91 get { | 99 get { |
| 92 return m_jsonExpression; | 100 return m_jsonExpression; |
| 93 } | 101 } |
| 94 } | 102 } |
| 101 | 109 |
| 102 Token SymbolRangeToken(char start, char stop) { | 110 Token SymbolRangeToken(char start, char stop) { |
| 103 return SymbolToken(Enumerable.Range(start,stop - start).Cast<char>()); | 111 return SymbolToken(Enumerable.Range(start,stop - start).Cast<char>()); |
| 104 } | 112 } |
| 105 | 113 |
| 106 protected override IAlphabetBuilder<char> CreateAlphabet() { | 114 protected override IndexedAlphabetBase<char> CreateAlphabet() { |
| 107 return new CharAlphabet(); | 115 return new CharAlphabet(); |
| 108 } | 116 } |
| 109 | 117 |
| 110 } | 118 } |
| 111 } | 119 } |
