summaryrefslogtreecommitdiff
path: root/src/PicoRec.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/PicoRec.java')
-rw-r--r--src/PicoRec.java44
1 files changed, 41 insertions, 3 deletions
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");
}
}