Mercurial > pub > ImplabNet
comparison Implab/JSON/JSONGrammar.cs @ 72:d67b95eddaf4 v2
promises refactoring
| author | cin |
|---|---|
| date | Thu, 04 Sep 2014 18:47:12 +0400 |
| parents | c0bf853aa04f |
| children | 97fbbf816844 |
comparison
equal
deleted
inserted
replaced
| 71:1714fd8678ef | 72:d67b95eddaf4 |
|---|---|
| 5 using System.Text; | 5 using System.Text; |
| 6 using System.Threading.Tasks; | 6 using System.Threading.Tasks; |
| 7 | 7 |
| 8 namespace Implab.JSON { | 8 namespace Implab.JSON { |
| 9 internal class JSONGrammar : Grammar<JSONGrammar> { | 9 internal class JSONGrammar : Grammar<JSONGrammar> { |
| 10 public enum TokenType : int{ | 10 public enum TokenType : int { |
| 11 None, | 11 None, |
| 12 BeginObject, | 12 BeginObject, |
| 13 EndObject, | 13 EndObject, |
| 14 BeginArray, | 14 BeginArray, |
| 15 EndArray, | 15 EndArray, |
| 51 var exp = expSign.Cat(sign.Optional()).Cat(digit.Closure()); | 51 var exp = expSign.Cat(sign.Optional()).Cat(digit.Closure()); |
| 52 var quote = SymbolToken('"'); | 52 var quote = SymbolToken('"'); |
| 53 var backSlash = SymbolToken('\\'); | 53 var backSlash = SymbolToken('\\'); |
| 54 var specialEscapeChars = SymbolSetToken('\\', '"', '/', 'b', 'f', 't', 'n', 'r'); | 54 var specialEscapeChars = SymbolSetToken('\\', '"', '/', 'b', 'f', 't', 'n', 'r'); |
| 55 var unicodeEspace = SymbolToken('u').Cat(hexDigit.Repeat(4)); | 55 var unicodeEspace = SymbolToken('u').Cat(hexDigit.Repeat(4)); |
| 56 var escape = backSlash.Cat(specialEscapeChars.Or(unicodeEspace)); | |
| 57 var whitespace = SymbolSetToken('\n', '\r', '\t', ' ').EClosure(); | 56 var whitespace = SymbolSetToken('\n', '\r', '\t', ' ').EClosure(); |
| 58 var beginObject = whitespace.Cat(SymbolToken('{')).Cat(whitespace); | 57 var beginObject = whitespace.Cat(SymbolToken('{')).Cat(whitespace); |
| 59 var endObject = whitespace.Cat(SymbolToken('}')).Cat(whitespace); | 58 var endObject = whitespace.Cat(SymbolToken('}')).Cat(whitespace); |
| 60 var beginArray = whitespace.Cat(SymbolToken('[')).Cat(whitespace); | 59 var beginArray = whitespace.Cat(SymbolToken('[')).Cat(whitespace); |
| 61 var endArray = whitespace.Cat(SymbolToken(']')).Cat(whitespace); | 60 var endArray = whitespace.Cat(SymbolToken(']')).Cat(whitespace); |
| 63 var valueSep = whitespace.Cat(SymbolToken(',')).Cat(whitespace); | 62 var valueSep = whitespace.Cat(SymbolToken(',')).Cat(whitespace); |
| 64 | 63 |
| 65 var number = minus.Optional().Cat(integer).Cat(frac.Optional()).Cat(exp.Optional()); | 64 var number = minus.Optional().Cat(integer).Cat(frac.Optional()).Cat(exp.Optional()); |
| 66 var literal = letters.Closure(); | 65 var literal = letters.Closure(); |
| 67 var unescaped = SymbolTokenExcept(Enumerable.Range(0, 0x20).Union(new int[] { '\\', '"' }).Select(x => (char)x)); | 66 var unescaped = SymbolTokenExcept(Enumerable.Range(0, 0x20).Union(new int[] { '\\', '"' }).Select(x => (char)x)); |
| 68 var character = unescaped.Or(escape); | |
| 69 var str = quote.Cat(character.EClosure()).Cat(quote); | |
| 70 | |
| 71 | 67 |
| 72 var jsonExpression = | 68 var jsonExpression = |
| 73 number.Tag(TokenType.Number) | 69 number.Tag(TokenType.Number) |
| 74 .Or(literal.Tag(TokenType.Literal)) | 70 .Or(literal.Tag(TokenType.Literal)) |
| 75 .Or(quote.Tag(TokenType.StringBound)) | 71 .Or(quote.Tag(TokenType.StringBound)) |
| 84 var jsonStringExpression = | 80 var jsonStringExpression = |
| 85 quote.Tag(TokenType.StringBound) | 81 quote.Tag(TokenType.StringBound) |
| 86 .Or(backSlash.Cat(specialEscapeChars).Tag(TokenType.EscapedChar)) | 82 .Or(backSlash.Cat(specialEscapeChars).Tag(TokenType.EscapedChar)) |
| 87 .Or(backSlash.Cat(unicodeEspace).Tag(TokenType.EscapedUnicode)) | 83 .Or(backSlash.Cat(unicodeEspace).Tag(TokenType.EscapedUnicode)) |
| 88 .Or(unescaped.Closure().Tag(TokenType.UnescapedChar)); | 84 .Or(unescaped.Closure().Tag(TokenType.UnescapedChar)); |
| 89 | 85 |
| 90 var jsonNumberExpression = | |
| 91 minus.Tag(TokenType.Minus) | |
| 92 .Or(SymbolToken('+').Tag(TokenType.Plus)) | |
| 93 .Or(digit.Closure().Tag(TokenType.Integer)) | |
| 94 .Or(dot.Tag(TokenType.Dot)) | |
| 95 .Or(expSign.Tag(TokenType.Exp)); | |
| 96 | 86 |
| 97 m_jsonDFA = BuildDFA(jsonExpression); | 87 m_jsonDFA = BuildDFA(jsonExpression); |
| 98 m_stringDFA = BuildDFA(jsonStringExpression); | 88 m_stringDFA = BuildDFA(jsonStringExpression); |
| 99 } | 89 } |
| 100 | 90 |
