OSDN Git Service

imported from subversion repository
[xerial/xerial-core.git] / src / main / java / org / xerial / silk / impl / InLineJSON.g
1 /*--------------------------------------------------------------------------\r
2  *  Copyright 2007 Taro L. Saito\r
3  *\r
4  *  Licensed under the Apache License, Version 2.0 (the "License");\r
5  *  you may not use this file except in compliance with the License.\r
6  *  You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  *  Unless required by applicable law or agreed to in writing, software\r
11  *  distributed under the License is distributed on an "AS IS" BASIS,\r
12  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  *  See the License for the specific language governing permissions and\r
14  *  limitations under the License.\r
15  *--------------------------------------------------------------------------*/\r
16 //--------------------------------------\r
17 // XerialJ Project\r
18 //\r
19 // InLineJSON.g\r
20 // Since: 2009/01/30\r
21 //\r
22 //--------------------------------------\r
23  \r
24 grammar InLineJSON;\r
25 options\r
26 {\r
27         language=Java;\r
28 //      output=AST;\r
29 }\r
30   \r
31  \r
32 @lexer::header\r
33 {\r
34 //--------------------------------------\r
35 // XerialJ Project\r
36 //\r
37 // InLineJSONLexer.java\r
38 // Since: Apr 26, 2007\r
39 //\r
40 //--------------------------------------\r
41 package org.xerial.silk.impl;\r
42 }\r
43 \r
44 @lexer::members {\r
45   public int nesting = 1;       // json fragment begins with nesting\r
46 }\r
47 \r
48 @header\r
49 {\r
50 //--------------------------------------\r
51 // XerialJ Project\r
52 //\r
53 // InLineJSONParser.java\r
54 // Since: Apr 26, 2007\r
55 //\r
56 //--------------------------------------\r
57 package org.xerial.silk.impl;\r
58 }\r
59 \r
60 \r
61 WhiteSpace: (' ' | '\r' | '\t' | '\u000C' | '\n') { $channel=HIDDEN; };\r
62 \r
63 fragment Digit: '0' .. '9';\r
64 fragment Letter: 'A' .. 'F' | 'a' .. 'f';\r
65 fragment HexDigit: Digit | Letter;\r
66 fragment UnicodeChar: ~('"'| '\\');\r
67 fragment EscapeSequence\r
68         : '\\' ('\"' | '\\' | '/' | 'b' | 'f' | 'n' | 'r' | 't' | 'u' HexDigit HexDigit HexDigit HexDigit)\r
69         ; \r
70 \r
71 fragment StringChar :  UnicodeChar | EscapeSequence;\r
72 \r
73 fragment StringChar_s: StringChar*;\r
74 String: '"' s=StringChar_s '"' { setText($s.text); };\r
75 \r
76 \r
77 Colon: ':';\r
78 Comma: ',';\r
79 Integer: '-'? ('0' | '1'..'9' Digit*);\r
80 fragment Frac: '.' Digit+;\r
81 fragment Exp: ('e' | 'E') ('+' | '-')? Digit+;\r
82 Double: Integer (Frac Exp? | Exp);\r
83 \r
84 LBrace: '{' { nesting++; } ;\r
85 RBrace: '}' { nesting--; if (nesting<=0) { emit(Token.EOF_TOKEN); } };\r
86 LBracket: '[' { nesting++; } ;\r
87 RBracket: ']' { nesting--; if (nesting<=0) { emit(Token.EOF_TOKEN); } };\r
88 \r
89 /*\r
90 fragment NameChar: Letter | Digit | '_' | '-' | '@' | '.';\r
91 QName: (Letter | '_') NameChar*;\r
92 */\r
93 \r
94 // parser\r
95 \r
96 jsonObjectFragment: jsonElement (Comma jsonElement)*;\r
97 jsonArrayFragment: jsonValue (Comma jsonValue)*;\r
98 \r
99 jsonObject: LBrace jsonElement (',' jsonElement)* RBrace;\r
100 jsonElement: String Colon jsonValue; \r
101 jsonArray: LBracket jsonValue (',' jsonValue)* RBracket;\r
102 \r
103 jsonValue\r
104         : jsonObject\r
105         | jsonArray\r
106         | String\r
107         | Integer\r
108         | Double\r
109         | 'true'\r
110         | 'false'\r
111         | 'null'\r
112         ;\r
113 \r
114 \r
115 \r
116 \r
117