jps-bootstrap: pass some excessive logging to verbose
[idea/community.git] / json / json.bnf
1 {
2   parserClass = 'com.intellij.json.JsonParser'
3   parserUtilClass = "com.intellij.json.psi.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   psiVisitorName = "JsonElementVisitor"
11
12   psiImplUtilClass = 'com.intellij.json.psi.impl.JsonPsiImplUtils'
13   tokenTypeClass = 'com.intellij.json.JsonTokenType'
14
15   implements("value") = "com.intellij.json.psi.JsonElement"
16   extends("value") = "com.intellij.json.psi.impl.JsonElementImpl"
17
18     tokens = [
19         L_CURLY='{'
20         R_CURLY='}'
21         L_BRACKET='['
22         R_BRACKET=']'
23
24         COMMA=','
25         COLON=':'
26         LINE_COMMENT='regexp://.*'
27         // "/*" ([^*]|\*+[^*/])* (\*+"/")?
28         BLOCK_COMMENT='regexp:/\*([^*]|\*+[^*/])*(\*+/)?'
29         // else /\*(?:[^*]|\*[^/])*\*+/
30
31         // unclosed string literal matches till the line's end
32         // any escape sequences included, illegal escapes are indicated by SyntaxHighlighter
33         // and JsonStringLiteralAnnotator
34         DOUBLE_QUOTED_STRING="regexp:\"([^\\\"\r\n]|\\[^\r\n])*\"?"
35         SINGLE_QUOTED_STRING="regexp:'([^\\\'\r\n]|\\[^\r\n])*'?"
36 //        STRING='regexp:"([^\\"\r\n]|\\([\\"/bfnrt]|u[a-fA-F0-9]{4}))*"?'
37
38         NUMBER='regexp:-?(0|[1-9]\d*)(\.\d+)?([eE][+-]?\d*)?'
39         TRUE='true'
40         FALSE='false'
41         NULL='null'
42         // Actually not defined in RFC 4627, but may be used for JSON5 and helps with
43         // auto completion of keywords. Semantically, it represents "bad word" type
44         // of tokens
45         // Could be as loose as [^\s\[\]{}:,\"\']+, but is slightly more restricted
46         // for the time being to match most forms of npm package names and semver versions
47         // in package.json.
48         // See https://github.com/npm/validate-npm-package-name
49         IDENTIFIER="regexp:[[:jletterdigit:]~!()*\-./@\^<>=]+"
50     ]
51
52     extends("container|literal|reference_expression")=value
53     extends("array|object")=container
54     extends("string_literal|number_literal|boolean_literal|null_literal")=literal
55     implements("property")=[
56       "com.intellij.json.psi.JsonElement"
57       "com.intellij.psi.PsiNamedElement"
58     ]
59 }
60
61 // For compatibility we allow any value at root level (see JsonStandardComplianceAnnotator)
62 // Empty file is also allowed
63 json ::= value*
64
65 object ::= '{' object_element* '}' {
66   pin=1
67   methods=[
68     findProperty
69     getPresentation
70   ]
71   mixin="com.intellij.json.psi.impl.JsonObjectMixin"
72 }
73
74 // Hackity-hack to parse array elements and properties even if separating commas are missing,
75 // TODO: Find out if there is any simpler way to do so in GrammarKit
76 private object_element ::= property (','|&'}') {
77   recoverWhile = not_brace_or_next_value
78   pin = 1
79 }
80
81 property ::= property_name (':' value) {
82   methods=[
83     getName
84     getNameElement
85     getValue
86     // suppress getValueList() accessor
87     value=""
88     getPresentation
89   ]
90   mixin="com.intellij.json.psi.impl.JsonPropertyMixin"
91   pin(".*")=1
92 }
93
94 private property_name ::= literal | reference_expression
95
96 array ::= '[' array_element* ']' {
97   methods=[
98     getPresentation
99   ]
100   pin=1
101 }
102
103 private array_element ::= value (','|&']') {
104   recoverWhile = not_bracket_or_next_value
105   pin=1
106 }
107
108 string_literal ::= SINGLE_QUOTED_STRING | DOUBLE_QUOTED_STRING {
109   methods=[
110     getTextFragments
111     getValue
112     isPropertyName
113     SINGLE_QUOTED_STRING=""
114     DOUBLE_QUOTED_STRING=""
115   ]
116   mixin="com.intellij.json.psi.impl.JsonStringLiteralMixin"
117 }
118 number_literal ::= NUMBER {
119   methods=[
120     NUMBER=""
121     getValue
122   ]
123 }
124 boolean_literal ::= TRUE | FALSE {
125   methods=[
126     getValue
127   ]
128 }
129 null_literal ::= NULL
130
131 literal ::= string_literal | number_literal | boolean_literal | null_literal {
132   methods=[
133     isQuotedString
134   ]
135   mixin="com.intellij.json.psi.impl.JsonLiteralMixin"
136 }
137
138 fake container ::=
139
140 reference_expression ::= IDENTIFIER
141
142 value ::= object | array | literal | reference_expression
143
144 // Recoveries
145 private not_bracket_or_next_value ::= !(']'|value)
146 private not_brace_or_next_value ::= !('}'|value)