Skip to content

Latest commit

 

History

History
69 lines (62 loc) · 2.03 KB

File metadata and controls

69 lines (62 loc) · 2.03 KB

Grammar

object -> {members} | {} members -> member | member,members member-> string:value array -> [elements] | [] elements-> value | value,elements value -> string | object | array | number | "null" | "true" | "false"

LL Grammar

object -> {object' object' -> members} | } members -> member member' member' -> ,members | epsilon member-> string:value array -> [array' array' -> elements] | ] elements -> value elements' elements' -> ,elements | epsilon value -> string | object | array | number | "null" | "true" | "false"

Status

  • JSON scanner, parser, AST
  • Error handling with line/column reporting
  • Panic-mode synchronization in JSON parser
  • Query scanner, parser, evaluator
  • Path-based query language (field, index, wildcard, string key)
  • REPL with replxx autocomplete
  • CLI argument for JSON file path
  • RAII ownership for AST and query steps
  • GoogleTest suite
  • Complete JSON spec coverage (\u, all escape sequences)
  • Query filters, existence checks, aggregations
  • Autocomplete for array indices and string-key contexts

Ideas & Improvements

  • Inspired by jq: a simpler interactive tool for JSON validation, previewing, and basic querying.
  • Future: SQL-like filters, transformations (JSON to XML), web UI for AST visualization.

Query language (implemented)

query -> step+
step        -> field | array_index | object_index | dot
array_index -> "[" NUMBER "]" | "[" "*" "]"
object_index-> "[" STRING "]"
field       -> IDENTIFIER
dot         -> "."

Tokens: NUMBER, IDENTIFIER, STRING, LBRACKET, RBRACKET, DOT, QSTAR

Roadmap (remaining)

Area Status
JSON scanner/parser/AST Done
Query scanner/parser/evaluator Done
Error handling (JSON + query) Done
REPL autocomplete Partial
Tests (GoogleTest) Done
Query filters / aggregations Not started
Full JSON spec (\u escapes) Not started

Example session

./json_parser mine.json
json> players
json> [0].player
json> [0].inventory[*].item
json> exit