From 8ff7130c86366ab2ef44c974ca1c40574c5ee15e Mon Sep 17 00:00:00 2001 From: "anand.ekka" Date: Tue, 29 Sep 2026 17:21:14 +0530 Subject: [PATCH] Generated Parser files. --- JSON.interp | 38 ++ JSON.tokens | 18 + JSONLexer.interp | 56 +++ JSONLexer.tokens | 18 + json_base_listener.go | 52 +++ json_lexer.go | 149 ++++++++ json_listener.go | 40 ++ json_parser.go | 831 ++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 1202 insertions(+) create mode 100644 JSON.interp create mode 100644 JSON.tokens create mode 100644 JSONLexer.interp create mode 100644 JSONLexer.tokens create mode 100644 json_base_listener.go create mode 100644 json_lexer.go create mode 100644 json_listener.go create mode 100644 json_parser.go diff --git a/JSON.interp b/JSON.interp new file mode 100644 index 0000000..922546d --- /dev/null +++ b/JSON.interp @@ -0,0 +1,38 @@ +token literal names: +null +'{' +',' +'}' +':' +'[' +']' +'null' +null +null +null +null + +token symbolic names: +null +null +null +null +null +null +null +null +BOOLEAN +STRING +NUMBER +WS + +rule names: +json +obj +pair +arr +value + + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 13, 57, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 19, 10, 3, 12, 3, 14, 3, 22, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 28, 10, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 7, 5, 38, 10, 5, 12, 5, 14, 5, 41, 11, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 47, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 55, 10, 6, 3, 6, 2, 2, 7, 2, 4, 6, 8, 10, 2, 2, 2, 60, 2, 12, 3, 2, 2, 2, 4, 27, 3, 2, 2, 2, 6, 29, 3, 2, 2, 2, 8, 46, 3, 2, 2, 2, 10, 54, 3, 2, 2, 2, 12, 13, 5, 10, 6, 2, 13, 3, 3, 2, 2, 2, 14, 15, 7, 3, 2, 2, 15, 20, 5, 6, 4, 2, 16, 17, 7, 4, 2, 2, 17, 19, 5, 6, 4, 2, 18, 16, 3, 2, 2, 2, 19, 22, 3, 2, 2, 2, 20, 18, 3, 2, 2, 2, 20, 21, 3, 2, 2, 2, 21, 23, 3, 2, 2, 2, 22, 20, 3, 2, 2, 2, 23, 24, 7, 5, 2, 2, 24, 28, 3, 2, 2, 2, 25, 26, 7, 3, 2, 2, 26, 28, 7, 5, 2, 2, 27, 14, 3, 2, 2, 2, 27, 25, 3, 2, 2, 2, 28, 5, 3, 2, 2, 2, 29, 30, 7, 11, 2, 2, 30, 31, 7, 6, 2, 2, 31, 32, 5, 10, 6, 2, 32, 7, 3, 2, 2, 2, 33, 34, 7, 7, 2, 2, 34, 39, 5, 10, 6, 2, 35, 36, 7, 4, 2, 2, 36, 38, 5, 10, 6, 2, 37, 35, 3, 2, 2, 2, 38, 41, 3, 2, 2, 2, 39, 37, 3, 2, 2, 2, 39, 40, 3, 2, 2, 2, 40, 42, 3, 2, 2, 2, 41, 39, 3, 2, 2, 2, 42, 43, 7, 8, 2, 2, 43, 47, 3, 2, 2, 2, 44, 45, 7, 7, 2, 2, 45, 47, 7, 8, 2, 2, 46, 33, 3, 2, 2, 2, 46, 44, 3, 2, 2, 2, 47, 9, 3, 2, 2, 2, 48, 55, 7, 11, 2, 2, 49, 55, 7, 12, 2, 2, 50, 55, 5, 4, 3, 2, 51, 55, 5, 8, 5, 2, 52, 55, 7, 10, 2, 2, 53, 55, 7, 9, 2, 2, 54, 48, 3, 2, 2, 2, 54, 49, 3, 2, 2, 2, 54, 50, 3, 2, 2, 2, 54, 51, 3, 2, 2, 2, 54, 52, 3, 2, 2, 2, 54, 53, 3, 2, 2, 2, 55, 11, 3, 2, 2, 2, 7, 20, 27, 39, 46, 54] \ No newline at end of file diff --git a/JSON.tokens b/JSON.tokens new file mode 100644 index 0000000..1e05606 --- /dev/null +++ b/JSON.tokens @@ -0,0 +1,18 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +T__5=6 +T__6=7 +BOOLEAN=8 +STRING=9 +NUMBER=10 +WS=11 +'{'=1 +','=2 +'}'=3 +':'=4 +'['=5 +']'=6 +'null'=7 diff --git a/JSONLexer.interp b/JSONLexer.interp new file mode 100644 index 0000000..06dd270 --- /dev/null +++ b/JSONLexer.interp @@ -0,0 +1,56 @@ +token literal names: +null +'{' +',' +'}' +':' +'[' +']' +'null' +null +null +null +null + +token symbolic names: +null +null +null +null +null +null +null +null +BOOLEAN +STRING +NUMBER +WS + +rule names: +T__0 +T__1 +T__2 +T__3 +T__4 +T__5 +T__6 +BOOLEAN +STRING +ESC +UNICODE +HEX +SAFECODEPOINT +NUMBER +INT +EXP +WS + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 13, 128, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 64, 10, 9, 3, 10, 3, 10, 3, 10, 7, 10, 69, 10, 10, 12, 10, 14, 10, 72, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 5, 11, 79, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 5, 15, 92, 10, 15, 3, 15, 3, 15, 3, 15, 6, 15, 97, 10, 15, 13, 15, 14, 15, 98, 5, 15, 101, 10, 15, 3, 15, 5, 15, 104, 10, 15, 3, 16, 3, 16, 3, 16, 7, 16, 109, 10, 16, 12, 16, 14, 16, 112, 11, 16, 5, 16, 114, 10, 16, 3, 17, 3, 17, 5, 17, 118, 10, 17, 3, 17, 3, 17, 3, 18, 6, 18, 123, 10, 18, 13, 18, 14, 18, 124, 3, 18, 3, 18, 2, 2, 19, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 2, 23, 2, 25, 2, 27, 2, 29, 12, 31, 2, 33, 2, 35, 13, 3, 2, 10, 10, 2, 36, 36, 49, 49, 94, 94, 100, 100, 104, 104, 112, 112, 116, 116, 118, 118, 5, 2, 50, 59, 67, 72, 99, 104, 5, 2, 2, 33, 36, 36, 94, 94, 3, 2, 50, 59, 3, 2, 51, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 5, 2, 11, 12, 15, 15, 34, 34, 2, 133, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 3, 37, 3, 2, 2, 2, 5, 39, 3, 2, 2, 2, 7, 41, 3, 2, 2, 2, 9, 43, 3, 2, 2, 2, 11, 45, 3, 2, 2, 2, 13, 47, 3, 2, 2, 2, 15, 49, 3, 2, 2, 2, 17, 63, 3, 2, 2, 2, 19, 65, 3, 2, 2, 2, 21, 75, 3, 2, 2, 2, 23, 80, 3, 2, 2, 2, 25, 86, 3, 2, 2, 2, 27, 88, 3, 2, 2, 2, 29, 91, 3, 2, 2, 2, 31, 113, 3, 2, 2, 2, 33, 115, 3, 2, 2, 2, 35, 122, 3, 2, 2, 2, 37, 38, 7, 125, 2, 2, 38, 4, 3, 2, 2, 2, 39, 40, 7, 46, 2, 2, 40, 6, 3, 2, 2, 2, 41, 42, 7, 127, 2, 2, 42, 8, 3, 2, 2, 2, 43, 44, 7, 60, 2, 2, 44, 10, 3, 2, 2, 2, 45, 46, 7, 93, 2, 2, 46, 12, 3, 2, 2, 2, 47, 48, 7, 95, 2, 2, 48, 14, 3, 2, 2, 2, 49, 50, 7, 112, 2, 2, 50, 51, 7, 119, 2, 2, 51, 52, 7, 110, 2, 2, 52, 53, 7, 110, 2, 2, 53, 16, 3, 2, 2, 2, 54, 55, 7, 118, 2, 2, 55, 56, 7, 116, 2, 2, 56, 57, 7, 119, 2, 2, 57, 64, 7, 103, 2, 2, 58, 59, 7, 104, 2, 2, 59, 60, 7, 99, 2, 2, 60, 61, 7, 110, 2, 2, 61, 62, 7, 117, 2, 2, 62, 64, 7, 103, 2, 2, 63, 54, 3, 2, 2, 2, 63, 58, 3, 2, 2, 2, 64, 18, 3, 2, 2, 2, 65, 70, 7, 36, 2, 2, 66, 69, 5, 21, 11, 2, 67, 69, 5, 27, 14, 2, 68, 66, 3, 2, 2, 2, 68, 67, 3, 2, 2, 2, 69, 72, 3, 2, 2, 2, 70, 68, 3, 2, 2, 2, 70, 71, 3, 2, 2, 2, 71, 73, 3, 2, 2, 2, 72, 70, 3, 2, 2, 2, 73, 74, 7, 36, 2, 2, 74, 20, 3, 2, 2, 2, 75, 78, 7, 94, 2, 2, 76, 79, 9, 2, 2, 2, 77, 79, 5, 23, 12, 2, 78, 76, 3, 2, 2, 2, 78, 77, 3, 2, 2, 2, 79, 22, 3, 2, 2, 2, 80, 81, 7, 119, 2, 2, 81, 82, 5, 25, 13, 2, 82, 83, 5, 25, 13, 2, 83, 84, 5, 25, 13, 2, 84, 85, 5, 25, 13, 2, 85, 24, 3, 2, 2, 2, 86, 87, 9, 3, 2, 2, 87, 26, 3, 2, 2, 2, 88, 89, 10, 4, 2, 2, 89, 28, 3, 2, 2, 2, 90, 92, 7, 47, 2, 2, 91, 90, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 100, 5, 31, 16, 2, 94, 96, 7, 48, 2, 2, 95, 97, 9, 5, 2, 2, 96, 95, 3, 2, 2, 2, 97, 98, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 94, 3, 2, 2, 2, 100, 101, 3, 2, 2, 2, 101, 103, 3, 2, 2, 2, 102, 104, 5, 33, 17, 2, 103, 102, 3, 2, 2, 2, 103, 104, 3, 2, 2, 2, 104, 30, 3, 2, 2, 2, 105, 114, 7, 50, 2, 2, 106, 110, 9, 6, 2, 2, 107, 109, 9, 5, 2, 2, 108, 107, 3, 2, 2, 2, 109, 112, 3, 2, 2, 2, 110, 108, 3, 2, 2, 2, 110, 111, 3, 2, 2, 2, 111, 114, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 113, 105, 3, 2, 2, 2, 113, 106, 3, 2, 2, 2, 114, 32, 3, 2, 2, 2, 115, 117, 9, 7, 2, 2, 116, 118, 9, 8, 2, 2, 117, 116, 3, 2, 2, 2, 117, 118, 3, 2, 2, 2, 118, 119, 3, 2, 2, 2, 119, 120, 5, 31, 16, 2, 120, 34, 3, 2, 2, 2, 121, 123, 9, 9, 2, 2, 122, 121, 3, 2, 2, 2, 123, 124, 3, 2, 2, 2, 124, 122, 3, 2, 2, 2, 124, 125, 3, 2, 2, 2, 125, 126, 3, 2, 2, 2, 126, 127, 8, 18, 2, 2, 127, 36, 3, 2, 2, 2, 15, 2, 63, 68, 70, 78, 91, 98, 100, 103, 110, 113, 117, 124, 3, 8, 2, 2] \ No newline at end of file diff --git a/JSONLexer.tokens b/JSONLexer.tokens new file mode 100644 index 0000000..1e05606 --- /dev/null +++ b/JSONLexer.tokens @@ -0,0 +1,18 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +T__5=6 +T__6=7 +BOOLEAN=8 +STRING=9 +NUMBER=10 +WS=11 +'{'=1 +','=2 +'}'=3 +':'=4 +'['=5 +']'=6 +'null'=7 diff --git a/json_base_listener.go b/json_base_listener.go new file mode 100644 index 0000000..61b1062 --- /dev/null +++ b/json_base_listener.go @@ -0,0 +1,52 @@ +// Code generated from grammars-v4/JSON.g4 by ANTLR 4.7.2. DO NOT EDIT. + +package parser // JSON + +import "github.com/antlr/antlr4/runtime/Go/antlr" + +// BaseJSONListener is a complete listener for a parse tree produced by JSONParser. +type BaseJSONListener struct{} + +var _ JSONListener = &BaseJSONListener{} + +// VisitTerminal is called when a terminal node is visited. +func (s *BaseJSONListener) VisitTerminal(node antlr.TerminalNode) {} + +// VisitErrorNode is called when an error node is visited. +func (s *BaseJSONListener) VisitErrorNode(node antlr.ErrorNode) {} + +// EnterEveryRule is called when any rule is entered. +func (s *BaseJSONListener) EnterEveryRule(ctx antlr.ParserRuleContext) {} + +// ExitEveryRule is called when any rule is exited. +func (s *BaseJSONListener) ExitEveryRule(ctx antlr.ParserRuleContext) {} + +// EnterJson is called when production json is entered. +func (s *BaseJSONListener) EnterJson(ctx *JsonContext) {} + +// ExitJson is called when production json is exited. +func (s *BaseJSONListener) ExitJson(ctx *JsonContext) {} + +// EnterObj is called when production obj is entered. +func (s *BaseJSONListener) EnterObj(ctx *ObjContext) {} + +// ExitObj is called when production obj is exited. +func (s *BaseJSONListener) ExitObj(ctx *ObjContext) {} + +// EnterPair is called when production pair is entered. +func (s *BaseJSONListener) EnterPair(ctx *PairContext) {} + +// ExitPair is called when production pair is exited. +func (s *BaseJSONListener) ExitPair(ctx *PairContext) {} + +// EnterArr is called when production arr is entered. +func (s *BaseJSONListener) EnterArr(ctx *ArrContext) {} + +// ExitArr is called when production arr is exited. +func (s *BaseJSONListener) ExitArr(ctx *ArrContext) {} + +// EnterValue is called when production value is entered. +func (s *BaseJSONListener) EnterValue(ctx *ValueContext) {} + +// ExitValue is called when production value is exited. +func (s *BaseJSONListener) ExitValue(ctx *ValueContext) {} diff --git a/json_lexer.go b/json_lexer.go new file mode 100644 index 0000000..a4ed177 --- /dev/null +++ b/json_lexer.go @@ -0,0 +1,149 @@ +// Code generated from grammars-v4/JSON.g4 by ANTLR 4.7.2. DO NOT EDIT. + +package parser + +import ( + "fmt" + "unicode" + + "github.com/antlr/antlr4/runtime/Go/antlr" +) +// Suppress unused import error +var _ = fmt.Printf +var _ = unicode.IsLetter + + +var serializedLexerAtn = []uint16{ + 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 13, 128, + 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, + 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, + 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, + 18, 9, 18, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, + 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, + 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 64, 10, 9, 3, 10, 3, 10, 3, 10, 7, 10, 69, + 10, 10, 12, 10, 14, 10, 72, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, + 5, 11, 79, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, + 13, 3, 14, 3, 14, 3, 15, 5, 15, 92, 10, 15, 3, 15, 3, 15, 3, 15, 6, 15, + 97, 10, 15, 13, 15, 14, 15, 98, 5, 15, 101, 10, 15, 3, 15, 5, 15, 104, + 10, 15, 3, 16, 3, 16, 3, 16, 7, 16, 109, 10, 16, 12, 16, 14, 16, 112, 11, + 16, 5, 16, 114, 10, 16, 3, 17, 3, 17, 5, 17, 118, 10, 17, 3, 17, 3, 17, + 3, 18, 6, 18, 123, 10, 18, 13, 18, 14, 18, 124, 3, 18, 3, 18, 2, 2, 19, + 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 2, 23, + 2, 25, 2, 27, 2, 29, 12, 31, 2, 33, 2, 35, 13, 3, 2, 10, 10, 2, 36, 36, + 49, 49, 94, 94, 100, 100, 104, 104, 112, 112, 116, 116, 118, 118, 5, 2, + 50, 59, 67, 72, 99, 104, 5, 2, 2, 33, 36, 36, 94, 94, 3, 2, 50, 59, 3, + 2, 51, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 5, 2, 11, 12, + 15, 15, 34, 34, 2, 133, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, + 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, + 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 35, + 3, 2, 2, 2, 3, 37, 3, 2, 2, 2, 5, 39, 3, 2, 2, 2, 7, 41, 3, 2, 2, 2, 9, + 43, 3, 2, 2, 2, 11, 45, 3, 2, 2, 2, 13, 47, 3, 2, 2, 2, 15, 49, 3, 2, 2, + 2, 17, 63, 3, 2, 2, 2, 19, 65, 3, 2, 2, 2, 21, 75, 3, 2, 2, 2, 23, 80, + 3, 2, 2, 2, 25, 86, 3, 2, 2, 2, 27, 88, 3, 2, 2, 2, 29, 91, 3, 2, 2, 2, + 31, 113, 3, 2, 2, 2, 33, 115, 3, 2, 2, 2, 35, 122, 3, 2, 2, 2, 37, 38, + 7, 125, 2, 2, 38, 4, 3, 2, 2, 2, 39, 40, 7, 46, 2, 2, 40, 6, 3, 2, 2, 2, + 41, 42, 7, 127, 2, 2, 42, 8, 3, 2, 2, 2, 43, 44, 7, 60, 2, 2, 44, 10, 3, + 2, 2, 2, 45, 46, 7, 93, 2, 2, 46, 12, 3, 2, 2, 2, 47, 48, 7, 95, 2, 2, + 48, 14, 3, 2, 2, 2, 49, 50, 7, 112, 2, 2, 50, 51, 7, 119, 2, 2, 51, 52, + 7, 110, 2, 2, 52, 53, 7, 110, 2, 2, 53, 16, 3, 2, 2, 2, 54, 55, 7, 118, + 2, 2, 55, 56, 7, 116, 2, 2, 56, 57, 7, 119, 2, 2, 57, 64, 7, 103, 2, 2, + 58, 59, 7, 104, 2, 2, 59, 60, 7, 99, 2, 2, 60, 61, 7, 110, 2, 2, 61, 62, + 7, 117, 2, 2, 62, 64, 7, 103, 2, 2, 63, 54, 3, 2, 2, 2, 63, 58, 3, 2, 2, + 2, 64, 18, 3, 2, 2, 2, 65, 70, 7, 36, 2, 2, 66, 69, 5, 21, 11, 2, 67, 69, + 5, 27, 14, 2, 68, 66, 3, 2, 2, 2, 68, 67, 3, 2, 2, 2, 69, 72, 3, 2, 2, + 2, 70, 68, 3, 2, 2, 2, 70, 71, 3, 2, 2, 2, 71, 73, 3, 2, 2, 2, 72, 70, + 3, 2, 2, 2, 73, 74, 7, 36, 2, 2, 74, 20, 3, 2, 2, 2, 75, 78, 7, 94, 2, + 2, 76, 79, 9, 2, 2, 2, 77, 79, 5, 23, 12, 2, 78, 76, 3, 2, 2, 2, 78, 77, + 3, 2, 2, 2, 79, 22, 3, 2, 2, 2, 80, 81, 7, 119, 2, 2, 81, 82, 5, 25, 13, + 2, 82, 83, 5, 25, 13, 2, 83, 84, 5, 25, 13, 2, 84, 85, 5, 25, 13, 2, 85, + 24, 3, 2, 2, 2, 86, 87, 9, 3, 2, 2, 87, 26, 3, 2, 2, 2, 88, 89, 10, 4, + 2, 2, 89, 28, 3, 2, 2, 2, 90, 92, 7, 47, 2, 2, 91, 90, 3, 2, 2, 2, 91, + 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 100, 5, 31, 16, 2, 94, 96, 7, 48, + 2, 2, 95, 97, 9, 5, 2, 2, 96, 95, 3, 2, 2, 2, 97, 98, 3, 2, 2, 2, 98, 96, + 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 94, 3, 2, 2, + 2, 100, 101, 3, 2, 2, 2, 101, 103, 3, 2, 2, 2, 102, 104, 5, 33, 17, 2, + 103, 102, 3, 2, 2, 2, 103, 104, 3, 2, 2, 2, 104, 30, 3, 2, 2, 2, 105, 114, + 7, 50, 2, 2, 106, 110, 9, 6, 2, 2, 107, 109, 9, 5, 2, 2, 108, 107, 3, 2, + 2, 2, 109, 112, 3, 2, 2, 2, 110, 108, 3, 2, 2, 2, 110, 111, 3, 2, 2, 2, + 111, 114, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 113, 105, 3, 2, 2, 2, 113, + 106, 3, 2, 2, 2, 114, 32, 3, 2, 2, 2, 115, 117, 9, 7, 2, 2, 116, 118, 9, + 8, 2, 2, 117, 116, 3, 2, 2, 2, 117, 118, 3, 2, 2, 2, 118, 119, 3, 2, 2, + 2, 119, 120, 5, 31, 16, 2, 120, 34, 3, 2, 2, 2, 121, 123, 9, 9, 2, 2, 122, + 121, 3, 2, 2, 2, 123, 124, 3, 2, 2, 2, 124, 122, 3, 2, 2, 2, 124, 125, + 3, 2, 2, 2, 125, 126, 3, 2, 2, 2, 126, 127, 8, 18, 2, 2, 127, 36, 3, 2, + 2, 2, 15, 2, 63, 68, 70, 78, 91, 98, 100, 103, 110, 113, 117, 124, 3, 8, + 2, 2, +} + +var lexerDeserializer = antlr.NewATNDeserializer(nil) +var lexerAtn = lexerDeserializer.DeserializeFromUInt16(serializedLexerAtn) + +var lexerChannelNames = []string{ + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", +} + +var lexerModeNames = []string{ + "DEFAULT_MODE", +} + +var lexerLiteralNames = []string{ + "", "'{'", "','", "'}'", "':'", "'['", "']'", "'null'", +} + +var lexerSymbolicNames = []string{ + "", "", "", "", "", "", "", "", "BOOLEAN", "STRING", "NUMBER", "WS", +} + +var lexerRuleNames = []string{ + "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "BOOLEAN", "STRING", + "ESC", "UNICODE", "HEX", "SAFECODEPOINT", "NUMBER", "INT", "EXP", "WS", +} + +type JSONLexer struct { + *antlr.BaseLexer + channelNames []string + modeNames []string + // TODO: EOF string +} + +var lexerDecisionToDFA = make([]*antlr.DFA, len(lexerAtn.DecisionToState)) + +func init() { + for index, ds := range lexerAtn.DecisionToState { + lexerDecisionToDFA[index] = antlr.NewDFA(ds, index) + } +} + +func NewJSONLexer(input antlr.CharStream) *JSONLexer { + + l := new(JSONLexer) + + l.BaseLexer = antlr.NewBaseLexer(input) + l.Interpreter = antlr.NewLexerATNSimulator(l, lexerAtn, lexerDecisionToDFA, antlr.NewPredictionContextCache()) + + l.channelNames = lexerChannelNames + l.modeNames = lexerModeNames + l.RuleNames = lexerRuleNames + l.LiteralNames = lexerLiteralNames + l.SymbolicNames = lexerSymbolicNames + l.GrammarFileName = "JSON.g4" + // TODO: l.EOF = antlr.TokenEOF + + return l +} + +// JSONLexer tokens. +const ( + JSONLexerT__0 = 1 + JSONLexerT__1 = 2 + JSONLexerT__2 = 3 + JSONLexerT__3 = 4 + JSONLexerT__4 = 5 + JSONLexerT__5 = 6 + JSONLexerT__6 = 7 + JSONLexerBOOLEAN = 8 + JSONLexerSTRING = 9 + JSONLexerNUMBER = 10 + JSONLexerWS = 11 +) + diff --git a/json_listener.go b/json_listener.go new file mode 100644 index 0000000..4cde754 --- /dev/null +++ b/json_listener.go @@ -0,0 +1,40 @@ +// Code generated from grammars-v4/JSON.g4 by ANTLR 4.7.2. DO NOT EDIT. + +package parser // JSON + +import "github.com/antlr/antlr4/runtime/Go/antlr" + +// JSONListener is a complete listener for a parse tree produced by JSONParser. +type JSONListener interface { + antlr.ParseTreeListener + + // EnterJson is called when entering the json production. + EnterJson(c *JsonContext) + + // EnterObj is called when entering the obj production. + EnterObj(c *ObjContext) + + // EnterPair is called when entering the pair production. + EnterPair(c *PairContext) + + // EnterArr is called when entering the arr production. + EnterArr(c *ArrContext) + + // EnterValue is called when entering the value production. + EnterValue(c *ValueContext) + + // ExitJson is called when exiting the json production. + ExitJson(c *JsonContext) + + // ExitObj is called when exiting the obj production. + ExitObj(c *ObjContext) + + // ExitPair is called when exiting the pair production. + ExitPair(c *PairContext) + + // ExitArr is called when exiting the arr production. + ExitArr(c *ArrContext) + + // ExitValue is called when exiting the value production. + ExitValue(c *ValueContext) +} diff --git a/json_parser.go b/json_parser.go new file mode 100644 index 0000000..156641f --- /dev/null +++ b/json_parser.go @@ -0,0 +1,831 @@ +// Code generated from grammars-v4/JSON.g4 by ANTLR 4.7.2. DO NOT EDIT. + +package parser // JSON + +import ( + "fmt" + "reflect" + "strconv" + + "github.com/antlr/antlr4/runtime/Go/antlr" +) + +// Suppress unused import errors +var _ = fmt.Printf +var _ = reflect.Copy +var _ = strconv.Itoa + + +var parserATN = []uint16{ + 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 13, 57, 4, + 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 3, 2, 3, 2, 3, + 3, 3, 3, 3, 3, 3, 3, 7, 3, 19, 10, 3, 12, 3, 14, 3, 22, 11, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 5, 3, 28, 10, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, + 5, 3, 5, 7, 5, 38, 10, 5, 12, 5, 14, 5, 41, 11, 5, 3, 5, 3, 5, 3, 5, 3, + 5, 5, 5, 47, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 55, 10, 6, + 3, 6, 2, 2, 7, 2, 4, 6, 8, 10, 2, 2, 2, 60, 2, 12, 3, 2, 2, 2, 4, 27, 3, + 2, 2, 2, 6, 29, 3, 2, 2, 2, 8, 46, 3, 2, 2, 2, 10, 54, 3, 2, 2, 2, 12, + 13, 5, 10, 6, 2, 13, 3, 3, 2, 2, 2, 14, 15, 7, 3, 2, 2, 15, 20, 5, 6, 4, + 2, 16, 17, 7, 4, 2, 2, 17, 19, 5, 6, 4, 2, 18, 16, 3, 2, 2, 2, 19, 22, + 3, 2, 2, 2, 20, 18, 3, 2, 2, 2, 20, 21, 3, 2, 2, 2, 21, 23, 3, 2, 2, 2, + 22, 20, 3, 2, 2, 2, 23, 24, 7, 5, 2, 2, 24, 28, 3, 2, 2, 2, 25, 26, 7, + 3, 2, 2, 26, 28, 7, 5, 2, 2, 27, 14, 3, 2, 2, 2, 27, 25, 3, 2, 2, 2, 28, + 5, 3, 2, 2, 2, 29, 30, 7, 11, 2, 2, 30, 31, 7, 6, 2, 2, 31, 32, 5, 10, + 6, 2, 32, 7, 3, 2, 2, 2, 33, 34, 7, 7, 2, 2, 34, 39, 5, 10, 6, 2, 35, 36, + 7, 4, 2, 2, 36, 38, 5, 10, 6, 2, 37, 35, 3, 2, 2, 2, 38, 41, 3, 2, 2, 2, + 39, 37, 3, 2, 2, 2, 39, 40, 3, 2, 2, 2, 40, 42, 3, 2, 2, 2, 41, 39, 3, + 2, 2, 2, 42, 43, 7, 8, 2, 2, 43, 47, 3, 2, 2, 2, 44, 45, 7, 7, 2, 2, 45, + 47, 7, 8, 2, 2, 46, 33, 3, 2, 2, 2, 46, 44, 3, 2, 2, 2, 47, 9, 3, 2, 2, + 2, 48, 55, 7, 11, 2, 2, 49, 55, 7, 12, 2, 2, 50, 55, 5, 4, 3, 2, 51, 55, + 5, 8, 5, 2, 52, 55, 7, 10, 2, 2, 53, 55, 7, 9, 2, 2, 54, 48, 3, 2, 2, 2, + 54, 49, 3, 2, 2, 2, 54, 50, 3, 2, 2, 2, 54, 51, 3, 2, 2, 2, 54, 52, 3, + 2, 2, 2, 54, 53, 3, 2, 2, 2, 55, 11, 3, 2, 2, 2, 7, 20, 27, 39, 46, 54, +} +var deserializer = antlr.NewATNDeserializer(nil) +var deserializedATN = deserializer.DeserializeFromUInt16(parserATN) + +var literalNames = []string{ + "", "'{'", "','", "'}'", "':'", "'['", "']'", "'null'", +} +var symbolicNames = []string{ + "", "", "", "", "", "", "", "", "BOOLEAN", "STRING", "NUMBER", "WS", +} + +var ruleNames = []string{ + "json", "obj", "pair", "arr", "value", +} +var decisionToDFA = make([]*antlr.DFA, len(deserializedATN.DecisionToState)) + +func init() { + for index, ds := range deserializedATN.DecisionToState { + decisionToDFA[index] = antlr.NewDFA(ds, index) + } +} + +type JSONParser struct { + *antlr.BaseParser +} + +func NewJSONParser(input antlr.TokenStream) *JSONParser { + this := new(JSONParser) + + this.BaseParser = antlr.NewBaseParser(input) + + this.Interpreter = antlr.NewParserATNSimulator(this, deserializedATN, decisionToDFA, antlr.NewPredictionContextCache()) + this.RuleNames = ruleNames + this.LiteralNames = literalNames + this.SymbolicNames = symbolicNames + this.GrammarFileName = "JSON.g4" + + return this +} + +// JSONParser tokens. +const ( + JSONParserEOF = antlr.TokenEOF + JSONParserT__0 = 1 + JSONParserT__1 = 2 + JSONParserT__2 = 3 + JSONParserT__3 = 4 + JSONParserT__4 = 5 + JSONParserT__5 = 6 + JSONParserT__6 = 7 + JSONParserBOOLEAN = 8 + JSONParserSTRING = 9 + JSONParserNUMBER = 10 + JSONParserWS = 11 +) + +// JSONParser rules. +const ( + JSONParserRULE_json = 0 + JSONParserRULE_obj = 1 + JSONParserRULE_pair = 2 + JSONParserRULE_arr = 3 + JSONParserRULE_value = 4 +) + +// IJsonContext is an interface to support dynamic dispatch. +type IJsonContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // IsJsonContext differentiates from other interfaces. + IsJsonContext() +} + +type JsonContext struct { + *antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyJsonContext() *JsonContext { + var p = new(JsonContext) + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(nil, -1) + p.RuleIndex = JSONParserRULE_json + return p +} + +func (*JsonContext) IsJsonContext() {} + +func NewJsonContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *JsonContext { + var p = new(JsonContext) + + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(parent, invokingState) + + p.parser = parser + p.RuleIndex = JSONParserRULE_json + + return p +} + +func (s *JsonContext) GetParser() antlr.Parser { return s.parser } + +func (s *JsonContext) Value() IValueContext { + var t = s.GetTypedRuleContext(reflect.TypeOf((*IValueContext)(nil)).Elem(), 0) + + if t == nil { + return nil + } + + return t.(IValueContext) +} + +func (s *JsonContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *JsonContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + + +func (s *JsonContext) EnterRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(JSONListener); ok { + listenerT.EnterJson(s) + } +} + +func (s *JsonContext) ExitRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(JSONListener); ok { + listenerT.ExitJson(s) + } +} + + + + +func (p *JSONParser) Json() (localctx IJsonContext) { + localctx = NewJsonContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 0, JSONParserRULE_json) + + defer func() { + p.ExitRule() + }() + + defer func() { + if err := recover(); err != nil { + if v, ok := err.(antlr.RecognitionException); ok { + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + } else { + panic(err) + } + } + }() + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(10) + p.Value() + } + + + + return localctx +} + + +// IObjContext is an interface to support dynamic dispatch. +type IObjContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // IsObjContext differentiates from other interfaces. + IsObjContext() +} + +type ObjContext struct { + *antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyObjContext() *ObjContext { + var p = new(ObjContext) + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(nil, -1) + p.RuleIndex = JSONParserRULE_obj + return p +} + +func (*ObjContext) IsObjContext() {} + +func NewObjContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *ObjContext { + var p = new(ObjContext) + + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(parent, invokingState) + + p.parser = parser + p.RuleIndex = JSONParserRULE_obj + + return p +} + +func (s *ObjContext) GetParser() antlr.Parser { return s.parser } + +func (s *ObjContext) AllPair() []IPairContext { + var ts = s.GetTypedRuleContexts(reflect.TypeOf((*IPairContext)(nil)).Elem()) + var tst = make([]IPairContext, len(ts)) + + for i, t := range ts { + if t != nil { + tst[i] = t.(IPairContext) + } + } + + return tst +} + +func (s *ObjContext) Pair(i int) IPairContext { + var t = s.GetTypedRuleContext(reflect.TypeOf((*IPairContext)(nil)).Elem(), i) + + if t == nil { + return nil + } + + return t.(IPairContext) +} + +func (s *ObjContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *ObjContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + + +func (s *ObjContext) EnterRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(JSONListener); ok { + listenerT.EnterObj(s) + } +} + +func (s *ObjContext) ExitRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(JSONListener); ok { + listenerT.ExitObj(s) + } +} + + + + +func (p *JSONParser) Obj() (localctx IObjContext) { + localctx = NewObjContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 2, JSONParserRULE_obj) + var _la int + + + defer func() { + p.ExitRule() + }() + + defer func() { + if err := recover(); err != nil { + if v, ok := err.(antlr.RecognitionException); ok { + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + } else { + panic(err) + } + } + }() + + p.SetState(25) + p.GetErrorHandler().Sync(p) + switch p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 1, p.GetParserRuleContext()) { + case 1: + p.EnterOuterAlt(localctx, 1) + { + p.SetState(12) + p.Match(JSONParserT__0) + } + { + p.SetState(13) + p.Pair() + } + p.SetState(18) + p.GetErrorHandler().Sync(p) + _la = p.GetTokenStream().LA(1) + + + for _la == JSONParserT__1 { + { + p.SetState(14) + p.Match(JSONParserT__1) + } + { + p.SetState(15) + p.Pair() + } + + + p.SetState(20) + p.GetErrorHandler().Sync(p) + _la = p.GetTokenStream().LA(1) + } + { + p.SetState(21) + p.Match(JSONParserT__2) + } + + + case 2: + p.EnterOuterAlt(localctx, 2) + { + p.SetState(23) + p.Match(JSONParserT__0) + } + { + p.SetState(24) + p.Match(JSONParserT__2) + } + + } + + + return localctx +} + + +// IPairContext is an interface to support dynamic dispatch. +type IPairContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // IsPairContext differentiates from other interfaces. + IsPairContext() +} + +type PairContext struct { + *antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyPairContext() *PairContext { + var p = new(PairContext) + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(nil, -1) + p.RuleIndex = JSONParserRULE_pair + return p +} + +func (*PairContext) IsPairContext() {} + +func NewPairContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *PairContext { + var p = new(PairContext) + + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(parent, invokingState) + + p.parser = parser + p.RuleIndex = JSONParserRULE_pair + + return p +} + +func (s *PairContext) GetParser() antlr.Parser { return s.parser } + +func (s *PairContext) STRING() antlr.TerminalNode { + return s.GetToken(JSONParserSTRING, 0) +} + +func (s *PairContext) Value() IValueContext { + var t = s.GetTypedRuleContext(reflect.TypeOf((*IValueContext)(nil)).Elem(), 0) + + if t == nil { + return nil + } + + return t.(IValueContext) +} + +func (s *PairContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *PairContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + + +func (s *PairContext) EnterRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(JSONListener); ok { + listenerT.EnterPair(s) + } +} + +func (s *PairContext) ExitRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(JSONListener); ok { + listenerT.ExitPair(s) + } +} + + + + +func (p *JSONParser) Pair() (localctx IPairContext) { + localctx = NewPairContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 4, JSONParserRULE_pair) + + defer func() { + p.ExitRule() + }() + + defer func() { + if err := recover(); err != nil { + if v, ok := err.(antlr.RecognitionException); ok { + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + } else { + panic(err) + } + } + }() + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(27) + p.Match(JSONParserSTRING) + } + { + p.SetState(28) + p.Match(JSONParserT__3) + } + { + p.SetState(29) + p.Value() + } + + + + return localctx +} + + +// IArrContext is an interface to support dynamic dispatch. +type IArrContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // IsArrContext differentiates from other interfaces. + IsArrContext() +} + +type ArrContext struct { + *antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyArrContext() *ArrContext { + var p = new(ArrContext) + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(nil, -1) + p.RuleIndex = JSONParserRULE_arr + return p +} + +func (*ArrContext) IsArrContext() {} + +func NewArrContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *ArrContext { + var p = new(ArrContext) + + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(parent, invokingState) + + p.parser = parser + p.RuleIndex = JSONParserRULE_arr + + return p +} + +func (s *ArrContext) GetParser() antlr.Parser { return s.parser } + +func (s *ArrContext) AllValue() []IValueContext { + var ts = s.GetTypedRuleContexts(reflect.TypeOf((*IValueContext)(nil)).Elem()) + var tst = make([]IValueContext, len(ts)) + + for i, t := range ts { + if t != nil { + tst[i] = t.(IValueContext) + } + } + + return tst +} + +func (s *ArrContext) Value(i int) IValueContext { + var t = s.GetTypedRuleContext(reflect.TypeOf((*IValueContext)(nil)).Elem(), i) + + if t == nil { + return nil + } + + return t.(IValueContext) +} + +func (s *ArrContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *ArrContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + + +func (s *ArrContext) EnterRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(JSONListener); ok { + listenerT.EnterArr(s) + } +} + +func (s *ArrContext) ExitRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(JSONListener); ok { + listenerT.ExitArr(s) + } +} + + + + +func (p *JSONParser) Arr() (localctx IArrContext) { + localctx = NewArrContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 6, JSONParserRULE_arr) + var _la int + + + defer func() { + p.ExitRule() + }() + + defer func() { + if err := recover(); err != nil { + if v, ok := err.(antlr.RecognitionException); ok { + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + } else { + panic(err) + } + } + }() + + p.SetState(44) + p.GetErrorHandler().Sync(p) + switch p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 3, p.GetParserRuleContext()) { + case 1: + p.EnterOuterAlt(localctx, 1) + { + p.SetState(31) + p.Match(JSONParserT__4) + } + { + p.SetState(32) + p.Value() + } + p.SetState(37) + p.GetErrorHandler().Sync(p) + _la = p.GetTokenStream().LA(1) + + + for _la == JSONParserT__1 { + { + p.SetState(33) + p.Match(JSONParserT__1) + } + { + p.SetState(34) + p.Value() + } + + + p.SetState(39) + p.GetErrorHandler().Sync(p) + _la = p.GetTokenStream().LA(1) + } + { + p.SetState(40) + p.Match(JSONParserT__5) + } + + + case 2: + p.EnterOuterAlt(localctx, 2) + { + p.SetState(42) + p.Match(JSONParserT__4) + } + { + p.SetState(43) + p.Match(JSONParserT__5) + } + + } + + + return localctx +} + + +// IValueContext is an interface to support dynamic dispatch. +type IValueContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // IsValueContext differentiates from other interfaces. + IsValueContext() +} + +type ValueContext struct { + *antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyValueContext() *ValueContext { + var p = new(ValueContext) + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(nil, -1) + p.RuleIndex = JSONParserRULE_value + return p +} + +func (*ValueContext) IsValueContext() {} + +func NewValueContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *ValueContext { + var p = new(ValueContext) + + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(parent, invokingState) + + p.parser = parser + p.RuleIndex = JSONParserRULE_value + + return p +} + +func (s *ValueContext) GetParser() antlr.Parser { return s.parser } + +func (s *ValueContext) STRING() antlr.TerminalNode { + return s.GetToken(JSONParserSTRING, 0) +} + +func (s *ValueContext) NUMBER() antlr.TerminalNode { + return s.GetToken(JSONParserNUMBER, 0) +} + +func (s *ValueContext) Obj() IObjContext { + var t = s.GetTypedRuleContext(reflect.TypeOf((*IObjContext)(nil)).Elem(), 0) + + if t == nil { + return nil + } + + return t.(IObjContext) +} + +func (s *ValueContext) Arr() IArrContext { + var t = s.GetTypedRuleContext(reflect.TypeOf((*IArrContext)(nil)).Elem(), 0) + + if t == nil { + return nil + } + + return t.(IArrContext) +} + +func (s *ValueContext) BOOLEAN() antlr.TerminalNode { + return s.GetToken(JSONParserBOOLEAN, 0) +} + +func (s *ValueContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *ValueContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + + +func (s *ValueContext) EnterRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(JSONListener); ok { + listenerT.EnterValue(s) + } +} + +func (s *ValueContext) ExitRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(JSONListener); ok { + listenerT.ExitValue(s) + } +} + + + + +func (p *JSONParser) Value() (localctx IValueContext) { + localctx = NewValueContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 8, JSONParserRULE_value) + + defer func() { + p.ExitRule() + }() + + defer func() { + if err := recover(); err != nil { + if v, ok := err.(antlr.RecognitionException); ok { + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + } else { + panic(err) + } + } + }() + + p.SetState(52) + p.GetErrorHandler().Sync(p) + + switch p.GetTokenStream().LA(1) { + case JSONParserSTRING: + p.EnterOuterAlt(localctx, 1) + { + p.SetState(46) + p.Match(JSONParserSTRING) + } + + + case JSONParserNUMBER: + p.EnterOuterAlt(localctx, 2) + { + p.SetState(47) + p.Match(JSONParserNUMBER) + } + + + case JSONParserT__0: + p.EnterOuterAlt(localctx, 3) + { + p.SetState(48) + p.Obj() + } + + + case JSONParserT__4: + p.EnterOuterAlt(localctx, 4) + { + p.SetState(49) + p.Arr() + } + + + case JSONParserBOOLEAN: + p.EnterOuterAlt(localctx, 5) + { + p.SetState(50) + p.Match(JSONParserBOOLEAN) + } + + + case JSONParserT__6: + p.EnterOuterAlt(localctx, 6) + { + p.SetState(51) + p.Match(JSONParserT__6) + } + + + + default: + panic(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) + } + + + return localctx +} + +