json.peg 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. json <- (object / array) !.
  2. object <- begin_object
  3. %member_list
  4. end_object
  5. member <- {: string name_separator value :}
  6. array <- begin_array
  7. {| (value (value_separator value)* )? |}
  8. end_array
  9. number <- { "-" ? int frac ? exp ? } => tonumber
  10. exp <- [Ee] [+-] ? [0-9]+
  11. frac <- "." [0-9]+
  12. int <- "0" / ( [1-9] [0-9]* )
  13. string <- '"' char* -> {} => final_string '"'
  14. char <- unescaped => normal
  15. / '\"' => escape
  16. / "\\" => escape
  17. / "\b" => escape
  18. / "\f" => escape
  19. / "\n" => escape
  20. / "\r" => escape
  21. / "\t" => escape
  22. / "\/" => escape
  23. / (
  24. "\u"
  25. { [0-9A-Fa-f]^4 } => tou16
  26. )+ -> {} => unicode
  27. unescaped <- [^\"%c]
  28. value <- "false" => retfalse
  29. / "null" => retnil
  30. / "true" => rettrue
  31. / object
  32. / array
  33. / number
  34. / string
  35. begin_array <- ws "[" ws
  36. end_array <- ws "]" ws
  37. begin_object <- ws "{" ws
  38. end_object <- ws "}" ws
  39. name_separator <- ws ":" ws
  40. value_separator <- ws "," ws
  41. ws <- %WS*