forked from fangyidong/json-simple
-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathjsonstrict.lex
More file actions
59 lines (50 loc) · 2.24 KB
/
jsonstrict.lex
File metadata and controls
59 lines (50 loc) · 2.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package com.github.cliftonlabs.json_simple;
%%
%{
private StringBuilder sb=new StringBuilder();
long getPosition(){
return yychar;
}
%}
%pack
%unicode
%state STRING_BEGIN
%yylexthrow JsonException
%char
HEX_D = [a-fA-F0-9]
DOUBLE = [-]?[0-9]+((\.[0-9]+)?([eE][-+]?[0-9]+)?)
WS = [ \t\r\n]
UNESCAPED_CH = [^\"\\]
FALLBACK_CH = .
%%
<STRING_BEGIN> \" { yybegin(YYINITIAL);return new Yytoken(Yytoken.Types.DATUM, sb.toString());}
<STRING_BEGIN> {UNESCAPED_CH}+ { sb.append(yytext());}
<STRING_BEGIN> \\\" {sb.append('"');}
<STRING_BEGIN> \\\\ {sb.append('\\');}
<STRING_BEGIN> \\\/ {sb.append('/');}
<STRING_BEGIN> \\b {sb.append('\b');}
<STRING_BEGIN> \\f {sb.append('\f');}
<STRING_BEGIN> \\n {sb.append('\n');}
<STRING_BEGIN> \\r {sb.append('\r');}
<STRING_BEGIN> \\t {sb.append('\t');}
<STRING_BEGIN> \\u{HEX_D}{HEX_D}{HEX_D}{HEX_D} { try{
int ch=Integer.parseInt(yytext().substring(2),16);
sb.append((char)ch);
}catch(Exception e){
/* The lexer is broken if it can build a 4 byte character code and fail to append the character. */
throw new JsonException(yychar, JsonException.Problems.UNEXPECTED_EXCEPTION, e);
}
}
<STRING_BEGIN> \\ {sb.append('\\');}
<YYINITIAL> \" { sb = null; sb = new StringBuilder(); yybegin(STRING_BEGIN);}
<YYINITIAL> {DOUBLE} { java.math.BigDecimal val= new java.math.BigDecimal(yytext()); return new Yytoken(Yytoken.Types.DATUM, val);}
<YYINITIAL> "true"|"false" { Boolean val=Boolean.valueOf(yytext()); return new Yytoken(Yytoken.Types.DATUM, val);}
<YYINITIAL> "null" { return new Yytoken(Yytoken.Types.DATUM, null);}
<YYINITIAL> "{" { return new Yytoken(Yytoken.Types.LEFT_BRACE, null);}
<YYINITIAL> "}" { return new Yytoken(Yytoken.Types.RIGHT_BRACE, null);}
<YYINITIAL> "[" { return new Yytoken(Yytoken.Types.LEFT_SQUARE, null);}
<YYINITIAL> "]" { return new Yytoken(Yytoken.Types.RIGHT_SQUARE, null);}
<YYINITIAL> "," { return new Yytoken(Yytoken.Types.COMMA, null);}
<YYINITIAL> ":" { return new Yytoken(Yytoken.Types.COLON, null);}
<YYINITIAL> {WS}+ {}
<YYINITIAL> {FALLBACK_CH} { throw new JsonException(yychar, JsonException.Problems.UNEXPECTED_CHARACTER, new Character(yycharat(0)));}