org.sonar.json.parser.JSONLexicalGrammar Maven / Gradle / Ivy
The newest version!
/*
* SonarQube JSON Analyzer
* Copyright (C) 2015-2017 David RACODON
* [email protected]
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.json.parser;
import com.sonar.sslr.api.GenericTokenType;
import org.sonar.sslr.grammar.GrammarRuleKey;
import org.sonar.sslr.grammar.LexerlessGrammarBuilder;
/*
* See https://tools.ietf.org/html/rfc7159 and http://json.org/
*/
public enum JSONLexicalGrammar implements GrammarRuleKey {
JSON,
OBJECT,
PAIR,
KEY,
ARRAY,
VALUE,
TRUE,
FALSE,
NULL,
STRING,
NUMBER,
COMMA,
COLON,
LEFT_BRACE,
RIGHT_BRACE,
LEFT_BRACKET,
RIGHT_BRACKET,
BOM,
EOF,
SPACING;
public static LexerlessGrammarBuilder createGrammar() {
LexerlessGrammarBuilder b = LexerlessGrammarBuilder.create();
syntax(b);
b.setRootRule(JSON);
return b;
}
private static void syntax(LexerlessGrammarBuilder b) {
b.rule(TRUE).is(SPACING, "true");
b.rule(FALSE).is(SPACING, "false");
b.rule(NULL).is(SPACING, "null");
b.rule(NUMBER).is(SPACING, b.regexp("[-]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?"));
b.rule(STRING).is(SPACING, b.regexp("\"([^\"\\\\]*+(\\\\([\\\\\"/bfnrt]|u[0-9a-fA-F]{4}))?+)*+\""));
b.rule(COMMA).is(SPACING, ",");
b.rule(COLON).is(SPACING, ":");
b.rule(LEFT_BRACE).is(SPACING, "{");
b.rule(RIGHT_BRACE).is(SPACING, "}");
b.rule(LEFT_BRACKET).is(SPACING, "[");
b.rule(RIGHT_BRACKET).is(SPACING, "]");
b.rule(BOM).is("\ufeff");
b.rule(EOF).is(SPACING, b.token(GenericTokenType.EOF, b.endOfInput()));
b.rule(SPACING).is(b.skippedTrivia(b.regexp("(?
© 2015 - 2025 Weber Informatics LLC | Privacy Policy