Theory JSON_Parsing
section ‹JSON Parsing›
theory JSON_Parsing
imports Lexer
begin
definition [consuming]:
"brace_open ≡ lx_ws *-- exactly ''{''"
definition [consuming]:
"brace_close ≡ lx_ws *-- exactly ''}''"
definition [consuming]:
"bracket_open ≡ lx_ws *-- exactly ''[''"
definition [consuming]:
"bracket_close ≡ lx_ws *-- exactly '']''"
definition [consuming]:
"colon ≡ lx_ws *-- exactly '':''"
definition [consuming]:
"comma ≡ lx_ws *-- exactly '',''"
definition json_character :: "(char,char) parser" where [consuming]:
"json_character ≡ do {
x←get;
if x ∉ set [CHR ''\"'', CHR 0x92, CHR ''⏎'']
then return x
else err_expecting (shows_string ''JSON string character'') }"
definition [consuming]:
"json_string = exactly ''\"'' *-- repeat json_character --* exactly ''\"''"
definition [consuming]:
"identifier = exactly ''\"'' *-- repeat1 json_character --* exactly ''\"''"
fun nats_to_nat :: "nat ⇒ nat list ⇒ nat" where
"nats_to_nat x [] = x" |
"nats_to_nat x (n # ns) = nats_to_nat (10 * x + n) ns"
datatype fract = Rat bool int int
definition lx_rat[consuming]:
"lx_rat ≡ lx_int -- exactly ''.'' *-- (repeat1 lx_digit' with int o nats_to_nat 0)
with (λ (a, b). if a ≥ 0 then Rat True a b else Rat False a b)"
definition
"parse_list a ≡ chainL1 (a with (λa. [a])) (do {comma; return (@)})"
abbreviation
"parse_list' a ≡ parse_list a ∥ lx_ws with (λ_. [])"
lemma parse_list_cong[fundef_cong]:
assumes "⋀l2. ll_fuel l2 ≤ ll_fuel l' ⟹ A l2 = A' l2"
assumes "l=l'"
shows "parse_list A l = parse_list A' l'"
unfolding parse_list_def chainL1_def
apply (intro bind_cong repeat_cong assms order_refl)
by auto