Mercurial > pub > ImplabNet
comparison Implab/Formats/JSON/JSONGrammar.cs @ 172:92d5278d1b10 ref20160224
Working on text scanner
| author | cin |
|---|---|
| date | Mon, 14 Mar 2016 01:19:38 +0300 |
| parents | e227e78d72e4 |
| children | 0c3c69fe225b |
comparison
equal
deleted
inserted
replaced
| 171:0f70905b4652 | 172:92d5278d1b10 |
|---|---|
| 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 | 5 |
| 5 namespace Implab.Formats.JSON { | 6 namespace Implab.Formats.JSON { |
| 6 class JSONGrammar : Grammar<char,JSONGrammar.TokenType> { | 7 class JSONGrammar : Grammar<char,JSONGrammar.TokenType> { |
| 7 public enum TokenType { | 8 public enum TokenType { |
| 8 None, | 9 None, |
| 33 | 34 |
| 34 public static JSONGrammar Instance { | 35 public static JSONGrammar Instance { |
| 35 get { return _instance.Value; } | 36 get { return _instance.Value; } |
| 36 } | 37 } |
| 37 | 38 |
| 38 readonly RegularCharDFADefinition<TokenType> m_jsonDFA; | 39 readonly RegularDFA<char, TokenType> m_jsonDFA; |
| 39 readonly RegularCharDFADefinition<TokenType> m_stringDFA; | 40 readonly RegularDFA<char, TokenType> m_stringDFA; |
| 40 | 41 |
| 41 public JSONGrammar() { | 42 public JSONGrammar() { |
| 42 DefineAlphabet(Enumerable.Range(0, 0x20).Select(x => (char)x)); | 43 DefineAlphabet(Enumerable.Range(0, 0x20).Select(x => (char)x)); |
| 43 var hexDigit = SymbolRangeToken('a','f').Or(SymbolRangeToken('A','F')).Or(SymbolRangeToken('0','9')); | 44 var hexDigit = SymbolRangeToken('a','f').Or(SymbolRangeToken('A','F')).Or(SymbolRangeToken('0','9')); |
| 44 var digit9 = SymbolRangeToken('1', '9'); | 45 var digit9 = SymbolRangeToken('1', '9'); |
| 85 .Or(backSlash.Cat(specialEscapeChars).Tag(TokenType.EscapedChar)) | 86 .Or(backSlash.Cat(specialEscapeChars).Tag(TokenType.EscapedChar)) |
| 86 .Or(backSlash.Cat(unicodeEspace).Tag(TokenType.EscapedUnicode)) | 87 .Or(backSlash.Cat(unicodeEspace).Tag(TokenType.EscapedUnicode)) |
| 87 .Or(unescaped.Closure().Tag(TokenType.UnescapedChar)); | 88 .Or(unescaped.Closure().Tag(TokenType.UnescapedChar)); |
| 88 | 89 |
| 89 | 90 |
| 90 m_jsonDFA = new RegularCharDFADefinition<TokenType>(new CharAlphabet()); | 91 m_jsonDFA = BuildDFA(jsonExpression); |
| 91 BuildDFA(jsonExpression, m_jsonDFA, m_jsonDFA.InputAlphabet); | 92 m_stringDFA = BuildDFA(jsonStringExpression); |
| 92 | |
| 93 | |
| 94 m_stringDFA = new RegularCharDFADefinition<TokenType>(new CharAlphabet()); | |
| 95 BuildDFA(jsonStringExpression, m_jsonDFA, m_jsonDFA.InputAlphabet); | |
| 96 } | 93 } |
| 97 | 94 |
| 98 public RegularCharDFADefinition<TokenType> JsonDFA { | 95 public RegularDFA<char, TokenType> JsonDFA { |
| 99 get { | 96 get { |
| 100 return m_jsonDFA; | 97 return m_jsonDFA; |
| 101 } | 98 } |
| 102 } | 99 } |
| 103 | 100 |
| 104 public RegularDFADefinition<char,TokenType> JsonStringDFA { | 101 public RegularDFA<char,TokenType> JsonStringDFA { |
| 105 get { | 102 get { |
| 106 return m_stringDFA; | 103 return m_stringDFA; |
| 107 } | 104 } |
| 108 } | 105 } |
| 109 | 106 |
| 110 Token<TokenType> SymbolRangeToken(char start, char stop) { | 107 Token<TokenType> SymbolRangeToken(char start, char stop) { |
| 111 return SymbolToken(Enumerable.Range(start,stop - start).Cast<char>()); | 108 return SymbolToken(Enumerable.Range(start,stop - start).Cast<char>()); |
| 112 } | 109 } |
| 110 | |
| 111 protected override IAlphabetBuilder<char> CreateAlphabet() { | |
| 112 return new CharAlphabet(); | |
| 113 } | |
| 113 | 114 |
| 114 } | 115 } |
| 115 } | 116 } |
