3d0573f3a05bc6df189c47066a6101da5178ced3
[idea/community.git] / json / src / json.bnf
1 {
2   parserClass = 'com.intellij.json.JsonParser'
3   parserUtilClass = "com.intellij.json.JsonParserUtil"
4   psiPackage = 'com.intellij.json.psi'
5   psiImplPackage = 'com.intellij.json.psi.impl'
6
7   elementTypeHolderClass = 'com.intellij.json.JsonElementTypes'
8   elementTypeClass = 'com.intellij.json.JsonElementType'
9   psiClassPrefix = "Json"
10
11   psiImplUtilClass = 'com.intellij.json.psi.impl.JsonPsiImplUtils'
12   tokenTypeClass = 'com.intellij.json.JsonTokenType'
13
14   implements = "com.intellij.json.psi.JsonElement"
15   extends = "com.intellij.json.psi.impl.JsonElementImpl"
16
17     tokens = [
18         L_CURLY='{'
19         R_CURLY='}'
20         L_BRACKET='['
21         R_BRACKET=']'
22         
23         COMMA=','
24         COLON=':'
25         // COMMENT='regexp:"//.*|/\*.*?\*/"'
26         // else /\*(?:[^*]|\*[^/])*\*+/
27
28         // unclosed string literal matches till the line's end
29         // any escape sequences included, illegal escapes are indicated by SyntaxHighlighter
30         // and JsonStringLiteralAnnotator
31         STRING='regexp:"([^\\"\r\n]|\\[^\r\n])*"?'
32 //        STRING='regexp:"([^\\"\r\n]|\\([\\"/bfnrt]|u[a-fA-F0-9]{4}))*"?'
33
34         NUMBER='regexp:-?\d+(\.\d+([eE][+-]?\d+)?)?'
35         TRUE='true'
36         FALSE='false'
37         NULL='null'
38         // Workaround for highlighting issue
39         // plays role of IDENTIFIER or NAME token in other languages
40         TEXT='regexp:\w+'
41     ]
42
43     extends("object|array|literal")=value
44     extends("string_literal|number_literal|boolean_literal|null_literal")=literal
45     implements("property")="com.intellij.json.psi.JsonNamedElement"
46 }
47
48 json ::= object | array
49
50 object ::= '{' object_element* '}' {
51   pin=1
52   methods=[
53     findProperty
54   ]
55 }
56
57 // Hackity-hack to parse array elements and properties even if separating commas are missing,
58 // TODO: Find out if there is any simpler way to do so in GrammarKit
59 private object_element ::= property (','|&'}') {
60   recoverWhile = not_brace_or_next_value
61   pin = 1
62 }
63
64 property ::= string_literal (':' value) {
65   methods=[
66     getName
67     getNameElement
68     getValue
69     // suppress getValueList() accessor
70     value=""
71   ]
72   mixin="com.intellij.json.psi.impl.JsonPropertyMixin"
73   pin(".*")=1
74 }
75
76 array ::= '[' array_element* ']' { pin=1 }
77
78 private array_element ::= value (','|&']') {
79   recoverWhile = not_bracket_or_next_value
80   pin=1
81 }
82
83 string_literal ::= STRING
84 number_literal ::= NUMBER
85 boolean_literal ::= TRUE | FALSE
86 null_literal ::= NULL
87
88 literal ::= string_literal | number_literal | boolean_literal | null_literal {
89   methods=[isQuotedString]
90   mixin="com.intellij.json.psi.impl.JsonLiteralMixin"
91 }
92 value ::= object | array | literal
93
94 // Recoveries
95 private not_bracket_or_next_value ::= !(']'|value)
96 private not_brace_or_next_value ::= !('}'|value)