comparison Implab/Formats/JSON/JSONGrammar.cs @ 176:0c3c69fe225b ref20160224

rewritten the text scanner
author cin
date Tue, 22 Mar 2016 18:58:40 +0300
parents 92d5278d1b10
children d5c5db0335ee
comparison
equal deleted inserted replaced
175:96a89dcb4060 176:0c3c69fe225b
18 ValueSeparator, 18 ValueSeparator,
19 19
20 StringBound, 20 StringBound,
21 EscapedChar, 21 EscapedChar,
22 UnescapedChar, 22 UnescapedChar,
23 EscapedUnicode, 23 EscapedUnicode
24
25 Minus,
26 Plus,
27 Sign,
28 Integer,
29 Dot,
30 Exp
31 } 24 }
32 25
33 static Lazy<JSONGrammar> _instance = new Lazy<JSONGrammar>(); 26 static Lazy<JSONGrammar> _instance = new Lazy<JSONGrammar>();
34 27
35 public static JSONGrammar Instance { 28 public static JSONGrammar Instance {
36 get { return _instance.Value; } 29 get { return _instance.Value; }
37 } 30 }
38 31
39 readonly RegularDFA<char, TokenType> m_jsonDFA; 32 readonly ScannerContext<TokenType> m_jsonDFA;
40 readonly RegularDFA<char, TokenType> m_stringDFA; 33 readonly ScannerContext<TokenType> m_stringDFA;
41 34
42 public JSONGrammar() { 35 public JSONGrammar() {
43 DefineAlphabet(Enumerable.Range(0, 0x20).Select(x => (char)x)); 36 DefineAlphabet(Enumerable.Range(0, 0x20).Select(x => (char)x));
44 var hexDigit = SymbolRangeToken('a','f').Or(SymbolRangeToken('A','F')).Or(SymbolRangeToken('0','9')); 37 var hexDigit = SymbolRangeToken('a','f').Or(SymbolRangeToken('A','F')).Or(SymbolRangeToken('0','9'));
45 var digit9 = SymbolRangeToken('1', '9'); 38 var digit9 = SymbolRangeToken('1', '9');
86 .Or(backSlash.Cat(specialEscapeChars).Tag(TokenType.EscapedChar)) 79 .Or(backSlash.Cat(specialEscapeChars).Tag(TokenType.EscapedChar))
87 .Or(backSlash.Cat(unicodeEspace).Tag(TokenType.EscapedUnicode)) 80 .Or(backSlash.Cat(unicodeEspace).Tag(TokenType.EscapedUnicode))
88 .Or(unescaped.Closure().Tag(TokenType.UnescapedChar)); 81 .Or(unescaped.Closure().Tag(TokenType.UnescapedChar));
89 82
90 83
91 m_jsonDFA = BuildDFA(jsonExpression); 84 m_jsonDFA = BuildScannerContext(jsonExpression);
92 m_stringDFA = BuildDFA(jsonStringExpression); 85 m_stringDFA = BuildScannerContext(jsonStringExpression);
93 } 86 }
94 87
95 public RegularDFA<char, TokenType> JsonDFA { 88 public ScannerContext<TokenType> JsonDFA {
96 get { 89 get {
97 return m_jsonDFA; 90 return m_jsonDFA;
98 } 91 }
99 } 92 }
100 93
101 public RegularDFA<char,TokenType> JsonStringDFA { 94 public ScannerContext<TokenType> JsonStringDFA {
102 get { 95 get {
103 return m_stringDFA; 96 return m_stringDFA;
104 } 97 }
105 } 98 }
106 99