Get rid of JsonNamedElement interface
[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")=[
46       "com.intellij.json.psi.JsonElement"
47       "com.intellij.psi.PsiNamedElement"
48     ]
49 }
50
51 json ::= object | array
52
53 object ::= '{' object_element* '}' {
54   pin=1
55   methods=[
56     findProperty
57   ]
58 }
59
60 // Hackity-hack to parse array elements and properties even if separating commas are missing,
61 // TODO: Find out if there is any simpler way to do so in GrammarKit
62 private object_element ::= property (','|&'}') {
63   recoverWhile = not_brace_or_next_value
64   pin = 1
65 }
66
67 property ::= string_literal (':' value) {
68   methods=[
69     getName
70     getNameElement
71     getValue
72     // suppress getValueList() accessor
73     value=""
74   ]
75   mixin="com.intellij.json.psi.impl.JsonPropertyMixin"
76   pin(".*")=1
77 }
78
79 array ::= '[' array_element* ']' { pin=1 }
80
81 private array_element ::= value (','|&']') {
82   recoverWhile = not_bracket_or_next_value
83   pin=1
84 }
85
86 string_literal ::= STRING
87 number_literal ::= NUMBER
88 boolean_literal ::= TRUE | FALSE
89 null_literal ::= NULL
90
91 literal ::= string_literal | number_literal | boolean_literal | null_literal {
92   methods=[isQuotedString]
93   mixin="com.intellij.json.psi.impl.JsonLiteralMixin"
94 }
95 value ::= object | array | literal
96
97 // Recoveries
98 private not_bracket_or_next_value ::= !(']'|value)
99 private not_brace_or_next_value ::= !('}'|value)