Files
openide/json/json.bnf
Mikhail Golubev 849760597d IDEA-169058 Match symbols "^<>=" as part of a fake identifier in JSON grammar
It contributes to better auto completion of node.js package versions
starting with these characters, since it's no longer necessary to wrap
such versions in quotes first (similarly to what has been done before
for package names).
2017-03-13 17:55:23 +03:00

144 lines
4.0 KiB
BNF

{
parserClass = 'com.intellij.json.JsonParser'
parserUtilClass = "com.intellij.json.psi.JsonParserUtil"
psiPackage = 'com.intellij.json.psi'
psiImplPackage = 'com.intellij.json.psi.impl'
elementTypeHolderClass = 'com.intellij.json.JsonElementTypes'
elementTypeClass = 'com.intellij.json.JsonElementType'
psiClassPrefix = "Json"
psiVisitorName = "JsonElementVisitor"
psiImplUtilClass = 'com.intellij.json.psi.impl.JsonPsiImplUtils'
tokenTypeClass = 'com.intellij.json.JsonTokenType'
implements("value") = "com.intellij.json.psi.JsonElement"
extends("value") = "com.intellij.json.psi.impl.JsonElementImpl"
tokens = [
L_CURLY='{'
R_CURLY='}'
L_BRACKET='['
R_BRACKET=']'
COMMA=','
COLON=':'
LINE_COMMENT='regexp://.*'
// "/*" ([^*]|\*+[^*/])* (\*+"/")?
BLOCK_COMMENT='regexp:/\*([^*]|\*+[^*/])*(\*+/)?'
// else /\*(?:[^*]|\*[^/])*\*+/
// unclosed string literal matches till the line's end
// any escape sequences included, illegal escapes are indicated by SyntaxHighlighter
// and JsonStringLiteralAnnotator
DOUBLE_QUOTED_STRING="regexp:\"([^\\\"\r\n]|\\[^\r\n])*\"?"
SINGLE_QUOTED_STRING="regexp:'([^\\\'\r\n]|\\[^\r\n])*'?"
// STRING='regexp:"([^\\"\r\n]|\\([\\"/bfnrt]|u[a-fA-F0-9]{4}))*"?'
NUMBER='regexp:-?(0|[1-9]\d*)(\.\d+)?([eE][+-]?\d*)?'
TRUE='true'
FALSE='false'
NULL='null'
// Actually not defined in RFC 4627, but may be used for JSON5 and helps with
// auto completion of keywords. Semantically, it represents "bad word" type
// of tokens
// Could be as loose as [^\s\[\]{}:,\"\']+, but is slightly more restricted
// for the time being to match most forms of npm package names and semver versions
// in package.json.
// See https://github.com/npm/validate-npm-package-name
IDENTIFIER="regexp:[[:jletterdigit:]~!()*\-./@\^<>=]+"
]
extends("container|literal|reference_expression")=value
extends("array|object")=container
extends("string_literal|number_literal|boolean_literal|null_literal")=literal
implements("property")=[
"com.intellij.json.psi.JsonElement"
"com.intellij.psi.PsiNamedElement"
]
}
// For compatibility we allow any value at root level (see JsonStandardComplianceAnnotator)
json ::= value+
object ::= '{' object_element* '}' {
pin=1
methods=[
findProperty
getPresentation
]
mixin="com.intellij.json.psi.impl.JsonObjectMixin"
}
// Hackity-hack to parse array elements and properties even if separating commas are missing,
// TODO: Find out if there is any simpler way to do so in GrammarKit
private object_element ::= property (','|&'}') {
recoverWhile = not_brace_or_next_value
pin = 1
}
property ::= property_name (':' value) {
methods=[
getName
getNameElement
getValue
// suppress getValueList() accessor
value=""
getPresentation
]
mixin="com.intellij.json.psi.impl.JsonPropertyMixin"
pin(".*")=1
}
private property_name ::= literal | reference_expression
array ::= '[' array_element* ']' {
methods=[
getPresentation
]
pin=1
}
private array_element ::= value (','|&']') {
recoverWhile = not_bracket_or_next_value
pin=1
}
string_literal ::= SINGLE_QUOTED_STRING | DOUBLE_QUOTED_STRING {
methods=[
getTextFragments
getValue
SINGLE_QUOTED_STRING=""
DOUBLE_QUOTED_STRING=""
]
mixin="com.intellij.json.psi.impl.JsonStringLiteralMixin"
}
number_literal ::= NUMBER {
methods=[
NUMBER=""
getValue
]
}
boolean_literal ::= TRUE | FALSE {
methods=[
getValue
]
}
null_literal ::= NULL
literal ::= string_literal | number_literal | boolean_literal | null_literal {
methods=[
isQuotedString
]
mixin="com.intellij.json.psi.impl.JsonLiteralMixin"
}
fake container ::=
reference_expression ::= IDENTIFIER
value ::= object | array | literal | reference_expression
// Recoveries
private not_bracket_or_next_value ::= !(']'|value)
private not_brace_or_next_value ::= !('}'|value)