X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=tests%2Fregression.tc;h=881a282965b0fc774283925b53c4d72f1ca015ee;hp=80b83c8a7a01403cdcae08ddd7ca7e1b4e4c7354;hb=HEAD;hpb=8a05c54202f3f5792bbd7146007c6718049fecd9 diff --git a/tests/regression.tc b/tests/regression.tc index 80b83c8..881a282 100644 --- a/tests/regression.tc +++ b/tests/regression.tc @@ -449,8 +449,70 @@ testcase "epsilon as a positive conjunct" { X:: = "a" ("b"+ & ()) } +testcase "ensure sharing of so-called reduction nodes" { + input "a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a "; + ignore output; + s:: = (S!)+ + S:: = A:: "a " + | B:: "a " +} + testcase "epsilon as a negative conjunct" { input "aaaaa"; s:: = X* X:: = "a" ("b"* &~ ()) } + +testcase "long input (reported by David Crawshaw)" { + input "0123456789"; + s:: = X* + X:: = "a" ("b"* &~ ()) +} + +testcase "a case PEGs cannot handle" { + input "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; + s:: = X + X:: = "x" X "x" | "x" +} + +testcase "indentation-driven binary tree parsing" { + input " +a +.g +..b +..b +.q +"; + output "block:{interior:{{a} block:{interior:{{g} block:{leaf:{b}} block:{leaf:{b}}}} block:{leaf:{q}}}}"; + + s = block "\n" + + // In the example below, the newline character \n is considered + // to be the "first" character of each line (rather than the "last" + // character of each line). This convention is a bit odd, but makes + // the example easier to understand. + + // this example uses periods for indentation to make the + // examples easier to read; in real life you would use + // whitespace + indent = "."** + + // outdent matches any sequence of lines in which the first + // line has indentation strictly greater than some subsequent line + outdent! = "." outdent "." + | "." ~[.] ~[]* "\n" + + // a block is a properly-indented (that is, non-outdent-matching) + // sequence of lines. It DOES NOT include the trailing newline. + block = block:: " "* "\n" indent! body + &~ " "* "\n" outdent ~[.] ~[]* + + // a body is what's left of a block after you remove the indentation + // from the first line + body = leaf + | interior + + leaf = "leaf":: [a-z0-9]++ + interior = "interior":: ("":: [a-z0-9]++) " "* block block + +}