|
Packit Service |
a2ae7a |
module Pass_simple_recursion =
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let rec lns =
|
|
Packit Service |
a2ae7a |
let lbr = del "<" "<" in
|
|
Packit Service |
a2ae7a |
let rbr = del ">" ">" in
|
|
Packit Service |
a2ae7a |
let k = [ key /[a-z]+/ ] in
|
|
Packit Service |
a2ae7a |
let node = [ label "S" . lbr . lns . rbr ] in
|
|
Packit Service |
a2ae7a |
let b = node | k in
|
|
Packit Service |
a2ae7a |
b*
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* let rec lns = [ key "a" . lns ] | [ key "a" ] *)
|
|
Packit Service |
a2ae7a |
test lns get "<x>" = { "S" { "x" } }
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test lns put "<x>" after rm "nothing" = "<x>"
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test lns put "<<x>>" after rm "nothing" = "<<x>>"
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test lns put "<x><x>" after rm "/S[2]" = "<x>"
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test lns put "<x>" after clear "/S/S/S/x" = "<x<<x>>>"
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* Start with { "S" { "x" } } and modify to { "S" { "S" { "x" } } } *)
|
|
Packit Service |
a2ae7a |
test lns put "<x>" after
|
|
Packit Service |
a2ae7a |
insa "S" "/S";
|
|
Packit Service |
a2ae7a |
clear "/S[2]/S/x";
|
|
Packit Service |
a2ae7a |
rm "/S[1]" = "<<x>>"
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test lns get "<<<x><x>><x>><x>" =
|
|
Packit Service |
a2ae7a |
{ "S"
|
|
Packit Service |
a2ae7a |
{ "S"
|
|
Packit Service |
a2ae7a |
{ "S" { "x" } }
|
|
Packit Service |
a2ae7a |
{ "S" { "x" } } }
|
|
Packit Service |
a2ae7a |
{ "S" { "x" } } }
|
|
Packit Service |
a2ae7a |
{ "S" { "x" } }
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test lns put "<<<x><x>><x>><x>" after rm "/S[1]/S[1]/S[1]" =
|
|
Packit Service |
a2ae7a |
"<<<x>><x>><x>"
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
test lns get "<<yo>><zulu>" =
|
|
Packit Service |
a2ae7a |
{ "S" { "S" { "yo" } } }
|
|
Packit Service |
a2ae7a |
{ "S" { "zulu" } }
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* Some pathological tests for nullable lenses *)
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let rec prim_nullable = [ prim_nullable . key /x/ ] | del /s*/ ""
|
|
Packit Service |
a2ae7a |
test prim_nullable get "sx" = { "x" }
|
|
Packit Service |
a2ae7a |
test prim_nullable get "x" = { "x" }
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let rec ambig = [ ambig . label "x" ] | del /s+/ "s"
|
|
Packit Service |
a2ae7a |
test ambig get "" = *
|
|
Packit Service |
a2ae7a |
test ambig get "s" = *
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* Test link filtering. These tests cause seemingly ambiguous parses, which
|
|
Packit Service |
a2ae7a |
* need to be disambiguated by filtering links in the Earley graph. See
|
|
Packit Service |
a2ae7a |
* section 5.3 in the paper *)
|
|
Packit Service |
a2ae7a |
let rec unamb1 = [ label "x" . unamb1 . store /y/ ] | [ key "z" ]
|
|
Packit Service |
a2ae7a |
test unamb1 get "zyy" = { "x" = "y" { "x" = "y" { "z" } } }
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let rec unamb2 = del /u*/ "" . [ unamb2 . key /x/ ] | del /s*/ ""
|
|
Packit Service |
a2ae7a |
test unamb2 get "sx" = { "x" }
|
|
Packit Service |
a2ae7a |
test unamb2 get "x" = { "x" }
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* Test proper handling of '?'; bug #119 *)
|
|
Packit Service |
a2ae7a |
let rec maybe = [ del "a" "a" . maybe . del "b" "b" ]?
|
|
Packit Service |
a2ae7a |
test maybe get "aabb" = { { } }
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* Test proper handling of '?'; bug #180 *)
|
|
Packit Service |
a2ae7a |
let rec maybe2 = [ del "a" "a" . maybe2 ]?
|
|
Packit Service |
a2ae7a |
test maybe2 get "aa" = { { } }
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let rec maybe3 = [ maybe3 . del "a" "a" ]?
|
|
Packit Service |
a2ae7a |
test maybe3 get "aa" = { { } }
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let rec maybe4 = [ del "a" "a" ] . maybe4?
|
|
Packit Service |
a2ae7a |
test maybe4 get "aa" = { } { }
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let rec maybe5 = maybe5? . [ del "a" "a" ]
|
|
Packit Service |
a2ae7a |
test maybe5 get "aa" = { } { }
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* Test that parses ending with a SCAN are accepted; bug #126 *)
|
|
Packit Service |
a2ae7a |
let dels (s:string) = del s s
|
|
Packit Service |
a2ae7a |
let d2 = del /b*/ ""
|
|
Packit Service |
a2ae7a |
let sec (body:lens) = [ key /a*/ . dels "{" . body . dels "}"]*
|
|
Packit Service |
a2ae7a |
let rec sec_complete = sec sec_complete
|
|
Packit Service |
a2ae7a |
let lns2 = sec_complete . d2
|
|
Packit Service |
a2ae7a |
test lns2 get "a{}b" = { "a" }
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
(* Test stack handling with both parsing direction; bug #136 *)
|
|
Packit Service |
a2ae7a |
let idr = [ key /[0-9]+/ . del /z+/ "z" . store /[0-9]+/ . del /a+/ "a" ]
|
|
Packit Service |
a2ae7a |
let rec idr_left = idr_left? . idr
|
|
Packit Service |
a2ae7a |
let rec idr_right = idr . idr_right?
|
|
Packit Service |
a2ae7a |
let input = "1zz2aa33zzz44aaa555zzzz666aaaa"
|
|
Packit Service |
a2ae7a |
test idr_left get input = { "1" = "2" }{ "33" = "44" }{ "555" = "666" }
|
|
Packit Service |
a2ae7a |
test idr_right get input = { "1" = "2" }{ "33" = "44" }{ "555" = "666" }
|