Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.21

require (
github.com/antlr4-go/antlr/v4 v4.13.0
github.com/blang/semver v3.5.1+incompatible
github.com/blang/semver/v4 v4.0.0
github.com/stretchr/testify v1.3.0
)

Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=
github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
Expand Down
4 changes: 3 additions & 1 deletion parser/JsonQuery.g4
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
grammar JsonQuery;

import SemverGrammar;

query
: NOT? SP? '(' SP? query SP? ')' #parenExp
| query SP LOGICAL_OPERATOR SP query #logicalExp
Expand Down Expand Up @@ -70,7 +72,7 @@ value
;

VERSION
: INT '.' INT '.' INT
: VALID_SEMVER
;

STRING
Expand Down
21 changes: 20 additions & 1 deletion parser/JsonQueryLexer.interp

Large diffs are not rendered by default.

178 changes: 178 additions & 0 deletions parser/SemverGrammar.g4
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
lexer grammar SemverGrammar;

/*
* ANTLR grammar for the Semver 2.0 specification. This is directly translated
* from the BNF Grammar at:
* https://semver.org/#backusnaur-form-grammar-for-valid-semver-versions
*
* This lexer grammar can be imported into other ANTLR grammars.
*/

/*
* <valid semver> ::= <version core>
* | <version core> "-" <prerelease>
* | <version core> "+" <build>
* | <version core> "-" <prerelease> "+" <build>
*/
fragment VALID_SEMVER
: VERSION_CORE ('-' PRERELEASE)? ('+' BUILD)?
;

/*
* <version core> ::= <major> "." <minor> "." <patch>
*/
fragment VERSION_CORE
: MAJOR '.' MINOR '.' PATCH
;

/*
* <major> ::= <numeric identifier>
*/
fragment MAJOR
: NUMERIC_IDENTIFIER
;

/*
* <minor> ::= <numeric identifier>
*/
fragment MINOR
: NUMERIC_IDENTIFIER
;

/*
* <patch> ::= <numeric identifier>
*/
fragment PATCH
: NUMERIC_IDENTIFIER
;

/*
* <prerelease> ::= <dot separated prerelease identifiers>
*/
fragment PRERELEASE
: DOT_SEPARATED_PRERELEASE_IDENTIFIERS
;

/*
* <dot separated prerelease identifiers> ::= <prerelease identifier>
* | <prerelease identifier> "." <dot separated prerelease identifiers>
*/
fragment DOT_SEPARATED_PRERELEASE_IDENTIFIERS
: PRERELEASE_IDENTIFIER ('.' PRERELEASE_IDENTIFIER)*
;

/*
* <build> ::= <dot separated build identifiers>
*/
fragment BUILD
: DOT_SEPARATED_BUILD_IDENTIFIERS
;

/*
* <dot separated build identifiers> ::= <build identifier>
* | <build identifier> "." <dot separated build identifiers>
*/
fragment DOT_SEPARATED_BUILD_IDENTIFIERS
: BUILD_IDENTIFIER ('.' BUILD_IDENTIFIER)*
;

/*
* <prerelease identifier> ::= <alphanumeric identifier>
* | <numeric identifier>
*/
fragment PRERELEASE_IDENTIFIER
: ALPHANUMERIC_IDENTIFIER
| NUMERIC_IDENTIFIER
;

/*
* <build identifier> ::= <alphanumeric identifier>
* | <digits>
*/
fragment BUILD_IDENTIFIER
: ALPHANUMERIC_IDENTIFIER
| DIGITS
;

/*
* <alphanumeric identifier> ::= <non digit>
* | <non digit> <identifier characters>
* | <identifier characters> <non digit>
* | <identifier characters> <non digit> <identifier characters>
*/
fragment ALPHANUMERIC_IDENTIFIER
: NON_DIGIT IDENTIFIER_CHARACTERS?
| IDENTIFIER_CHARACTERS* NON_DIGIT IDENTIFIER_CHARACTERS*
;

/*
* <numeric identifier> ::= "0"
* | <positive digit>
* | <positive digit> <digits>
*/
fragment NUMERIC_IDENTIFIER
: '0'
| POSITIVE_DIGIT DIGITS?
;

/*
* <identifier characters> ::= <identifier character>
* | <identifier character> <identifier characters>
*/
fragment IDENTIFIER_CHARACTERS
: IDENTIFIER_CHARACTER+
;

/*
* <identifier character> ::= <digit>
* | <non digit>
*/
fragment IDENTIFIER_CHARACTER
: DIGIT
| NON_DIGIT
;

/*
* <non digit> ::= <letter>
* | "-"
*/
fragment NON_DIGIT
: LETTER
| '-'
;

/*
* <digits> ::= <digit>
* | <digit> <digits>
*/
fragment DIGITS
: DIGIT+
;

/*
* <digit> ::= "0"
* | <positive digit>
*/
fragment DIGIT
: '0'
| POSITIVE_DIGIT
;

/*
* <positive digit> ::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
*/
fragment POSITIVE_DIGIT
: [1-9]
;

/*
* <letter> ::= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J"
* | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T"
* | "U" | "V" | "W" | "X" | "Y" | "Z" | "a" | "b" | "c" | "d"
* | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n"
* | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x"
* | "y" | "z"
*/
fragment LETTER
: [A-Za-z]
;
14 changes: 13 additions & 1 deletion parser/gen.sh
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1 +1,13 @@
antlr4 -Dlanguage=Go -visitor -no-listener JsonQuery.g4 -o ./
#!/bin/bash

# Try antlr4 first, fall back to antlr if not available
if command -v antlr4 >/dev/null 2>&1; then
ANTLR_CMD="antlr4"
elif command -v antlr >/dev/null 2>&1; then
ANTLR_CMD="antlr"
else
echo "Error: Neither antlr4 nor antlr command found. Please install ANTLR."
exit 1
fi

$ANTLR_CMD -Dlanguage=Go -visitor -no-listener JsonQuery.g4 -o ./
Loading