From f7dbc58eea06f4660c20dd21ffe81817641027e2 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Sun, 8 May 2016 19:22:42 +0200 Subject: PicoRec: add a bunch more tests, fix bugs --- src/PicoRec.java | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/PicoRec.java b/src/PicoRec.java index d38297f..ae9d0d6 100644 --- a/src/PicoRec.java +++ b/src/PicoRec.java @@ -13,7 +13,7 @@ public class PicoRec { /** Regular expression matches all tokens accepted by the language. */ private final static String tokenRegex = - "[\\|,;\\+\\*\\-]|:=|" + idRegex + "|" + natRegex; + "[\\|,;\\+\\*\\-\\(\\)]|:=|" + idRegex + "|" + natRegex; /** Regular expression matching layout tokens (to be ignored). */ private final static String layoutRegex = "[ \n]*"; @@ -93,7 +93,7 @@ public class PicoRec { private void parsePlusExpPrefixed() { // Parses PLUS-EXP' ::= "+" PROD-EXP PLUS-EXP' | while ("+".equals(next())) { - match("*"); + match("+"); parseProdExp(); parsePlusExpPrefixed(); } @@ -161,7 +161,7 @@ public class PicoRec { // if no symbol matched and this is not the end of string, fail if (length < 0 && offset < input.length()) { - throw new ParseError("Unrecognized non-token"); + throw new ParseError("Unrecognized non-token: " + input.substring(offset)); } return symbol; } @@ -226,17 +226,55 @@ public class PicoRec { rec.assertOk("begindeclare|end"); // simple expression rec.assertOk("begin declare a, | a := 1; end"); + // other tests + rec.assertOk("begindeclarea,|a:=1;end"); + rec.assertOk(" begin declare a , | a := 1 ; end \n"); + // substrings of keywords in IDs should be accepted + rec.assertOk("begin declare a, | a := endname; end"); + rec.assertOk("begin declare declarative, | a := 1; end"); + rec.assertOk("begin declare abc, | abegin := 1; end"); + // basic cases + rec.assertOk("begin declare a, | end"); + rec.assertOk("begin declare | a := 1; end"); + rec.assertOk("begin declare a, | a := -a; end"); + rec.assertOk("begin declare a, | a := abc; end"); + rec.assertOk("begin declare a, | a := 123; end"); + rec.assertOk("begin declare a, | a := (a); end"); + // more complicated expressions + rec.assertOk("begin declare a, | a := 2 * -3 + abc + def; end"); + rec.assertOk("begin declare a,b,c, | a := b + -(c*c*c) + -c; end"); + rec.assertOk("begin declare a,b, | a := -a; b := 1+23+456; end"); + rec.assertOk("begin declare a, | a := ---((a)); end"); // Failure cases rec.assertFail(""); rec.assertFail("begin"); rec.assertFail("begin declare"); rec.assertFail("begin declare |"); + rec.assertFail("begin declare a, | a := ; end"); rec.assertFail("begin declare a | a := 1; end"); rec.assertFail("begin declare a, | a := 1 end"); + rec.assertFail("begin declare a,b | a := 1; end"); + rec.assertFail("begin declare a, | a := 1;; end"); rec.assertFail("begin declare | end end"); + rec.assertFail("begin declare | endx"); rec.assertFail("begin declare end"); rec.assertFail("begin end"); rec.assertFail("end"); + // Failures in expression + rec.assertFail("begin declare a, | a := -; end"); + rec.assertFail("begin declare a, | a := -+1; end"); + rec.assertFail("begin declare a, | a := ; end"); + rec.assertFail("begin declare a, | a := (a; end"); + rec.assertFail("begin declare a, | a := (a)); end"); + rec.assertFail("begin declare a, | a := end; end"); + rec.assertFail("begin declare a, | a := end; end"); + // Keywords should not be used as identifiers + rec.assertFail("begin declare begin, | a := 1; end"); + rec.assertFail("begin declare a, | declare := 1; end"); + rec.assertFail("begin declare a, | a := end; end"); + // Whitespace is cannot split identifiers + rec.assertFail("begin dec lare abc, | end"); + rec.assertFail("begin declare a bc, | end"); } } -- cgit v1.2.1