mirror of
https://github.com/dragonflydb/dragonfly.git
synced 2024-12-14 11:58:02 +00:00
chore: parse a simple jsonpath (#2566)
Also, add an ubuntu-20 reusable devcontainer. Signed-off-by: Roman Gershman <roman@dragonflydb.io>
This commit is contained in:
parent
c2ee348d2c
commit
06d88ddc88
7 changed files with 73 additions and 10 deletions
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"name": "helio",
|
||||
"name": "fedora30",
|
||||
"image": "ghcr.io/romange/fedora:30",
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
|
|
10
.devcontainer/ubuntu20/cmake-tools-kits.json
Normal file
10
.devcontainer/ubuntu20/cmake-tools-kits.json
Normal file
|
@ -0,0 +1,10 @@
|
|||
[
|
||||
{
|
||||
"name": "GCC x86_64-linux-gnu",
|
||||
"compilers": {
|
||||
"C": "gcc",
|
||||
"CXX": "g++"
|
||||
},
|
||||
"isTrusted": true
|
||||
}
|
||||
]
|
21
.devcontainer/ubuntu20/devcontainer.json
Normal file
21
.devcontainer/ubuntu20/devcontainer.json
Normal file
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"name": "ubuntu20",
|
||||
"image": "ghcr.io/romange/ubuntu-dev:20",
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"ms-vscode.cpptools",
|
||||
"ms-vscode.cmake-tools",
|
||||
"ms-vscode.cpptools-themes",
|
||||
"twxs.cmake"
|
||||
],
|
||||
"settings": {
|
||||
"cmake.buildDirectory": "/build"
|
||||
}
|
||||
}
|
||||
},
|
||||
"mounts": [
|
||||
"source=ubuntu20-vol,target=/build,type=volume"
|
||||
],
|
||||
"postCreateCommand": ".devcontainer/ubuntu20/post-create.sh ${containerWorkspaceFolder}"
|
||||
}
|
6
.devcontainer/ubuntu20/post-create.sh
Executable file
6
.devcontainer/ubuntu20/post-create.sh
Executable file
|
@ -0,0 +1,6 @@
|
|||
#!/bin/bash
|
||||
|
||||
containerWorkspaceFolder=$1
|
||||
git config --global --add safe.directory ${containerWorkspaceFolder}/helio
|
||||
mkdir -p /root/.local/share/CMakeTools
|
||||
cp ${containerWorkspaceFolder}/.devcontainer/ubuntu20/cmake-tools-kits.json /root/.local/share/CMakeTools/
|
|
@ -45,12 +45,15 @@ using namespace std;
|
|||
|
||||
%token
|
||||
LBRACKET "["
|
||||
RBRACKET "]"
|
||||
ROOT "$"
|
||||
DOT "."
|
||||
WILDCARD "*"
|
||||
|
||||
// Needed 0 at the end to satisfy bison 3.5.1
|
||||
%token YYEOF 0
|
||||
%token <std::string> UNQ_STR "unq_str"
|
||||
%token <std::string> UNQ_STR "unquoted string"
|
||||
%token <unsigned> UINT "integer"
|
||||
|
||||
%%
|
||||
// Based on the following specification:
|
||||
|
@ -60,14 +63,21 @@ jsonpath: ROOT
|
|||
| ROOT relative_location
|
||||
|
||||
relative_location: DOT relative_path
|
||||
| LBRACKET bracket_expr RBRACKET
|
||||
|
||||
relative_path: identifier
|
||||
| identifier relative_location
|
||||
relative_path: identifier opt_relative_location
|
||||
| WILDCARD opt_relative_location
|
||||
|
||||
identifier: unquoted_string
|
||||
opt_relative_location:
|
||||
| relative_location
|
||||
|
||||
identifier: UNQ_STR
|
||||
// | single_quoted_string | double_quoted_string
|
||||
|
||||
unquoted_string : UNQ_STR
|
||||
bracket_expr: WILDCARD
|
||||
| index_expr
|
||||
|
||||
index_expr: UINT
|
||||
|
||||
%%
|
||||
|
||||
|
|
|
@ -5,7 +5,8 @@
|
|||
|
||||
|
||||
%{
|
||||
// SECOND SECTION
|
||||
#include <absl/strings/numbers.h>
|
||||
#include "base/logging.h"
|
||||
%}
|
||||
|
||||
%o bison-cc-namespace="dfly.json" bison-cc-parser="Parser"
|
||||
|
@ -41,6 +42,14 @@
|
|||
|
||||
"$" return Parser::make_ROOT(loc());
|
||||
"." return Parser::make_DOT(loc());
|
||||
"[" return Parser::make_LBRACKET(loc());
|
||||
"]" return Parser::make_RBRACKET(loc());
|
||||
"*" return Parser::make_WILDCARD(loc());
|
||||
[0-9]{1,9} {
|
||||
unsigned val;
|
||||
CHECK(absl::SimpleAtoi(str(), &val));
|
||||
return Parser::make_UINT(val, loc());
|
||||
}
|
||||
\w[\w_\-]* return Parser::make_UNQ_STR(str(), loc());
|
||||
<<EOF>> printf("EOF%s\n", matcher().text());
|
||||
%%
|
||||
|
|
|
@ -31,21 +31,28 @@ class JsonPathTest : public ::testing::Test {
|
|||
#define NEXT_TOK(tok_enum) \
|
||||
{ \
|
||||
auto tok = Lex(); \
|
||||
ASSERT_EQ(tok.type_get(), Parser::token::TOK_##tok_enum); \
|
||||
ASSERT_EQ(Parser::token::TOK_##tok_enum, tok.type_get()); \
|
||||
}
|
||||
|
||||
#define NEXT_EQ(tok_enum, type, val) \
|
||||
{ \
|
||||
auto tok = Lex(); \
|
||||
ASSERT_EQ(tok.type_get(), Parser::token::TOK_##tok_enum); \
|
||||
ASSERT_EQ(Parser::token::TOK_##tok_enum, tok.type_get()); \
|
||||
EXPECT_EQ(val, tok.value.as<type>()); \
|
||||
}
|
||||
|
||||
TEST_F(JsonPathTest, Scanner) {
|
||||
SetInput("$.мага-зин2.book[0].title");
|
||||
SetInput("$.мага-зин2.book[0].*");
|
||||
NEXT_TOK(ROOT);
|
||||
NEXT_TOK(DOT);
|
||||
NEXT_EQ(UNQ_STR, string, "мага-зин2");
|
||||
NEXT_TOK(DOT);
|
||||
NEXT_EQ(UNQ_STR, string, "book");
|
||||
NEXT_TOK(LBRACKET);
|
||||
NEXT_EQ(UINT, unsigned, 0);
|
||||
NEXT_TOK(RBRACKET);
|
||||
NEXT_TOK(DOT);
|
||||
NEXT_TOK(WILDCARD);
|
||||
}
|
||||
|
||||
} // namespace dfly::json
|
||||
|
|
Loading…
Reference in a new issue