/* * Authors: * Peter Wu (0783206) * Andrea Evangelista (0876766) */ package regex; import dk.brics.automaton.RegExp; import dk.brics.automaton.RunAutomaton; public class RegexTest { private final RunAutomaton r; public RegexTest(String regex) { System.out.println("regular expression = " + regex); r = new RunAutomaton(new RegExp(regex).toAutomaton()); } public long dfaMatch(String input, int index) { long start = System.nanoTime(); int length = r.run(input, index); long end = System.nanoTime(); if (length == -1) { System.out.println("No match found!"); } else { String s = input.substring(index, index + length); System.out.println("Found: " + s); } return end - start; } void runTest(String input, int index) { System.out.println("input string = " + input); System.out.println("index = " + index); long dfaMatchTime = dfaMatch(input, index); System.out.println("dfaMatchTime " + dfaMatchTime); } private void check(String input, boolean expectOk) { boolean accepted = r.run(input); System.out.println("Testing input: " + input); if (expectOk && !accepted || !expectOk && accepted) { throw new RuntimeException("Unexpected result for " + input); } } void assertOk(String input) { check(input, true); } void assertFail(String input) { check(input, false); } static void checkId() { RegexTest reId = new RegexTest("[a-z][a-z0-9]*"); reId.assertOk("id"); reId.assertOk("d0d"); reId.assertFail("Id"); reId.assertFail("0"); reId.assertFail("0d"); reId.assertFail("aD"); System.out.println(); } static void checkNAT() { RegexTest reNAT = new RegexTest("[0]|[1-9][0-9]*"); reNAT.assertOk("2"); reNAT.assertOk("14451"); reNAT.assertFail("Id"); reNAT.assertFail("-145711"); reNAT.assertFail("01"); System.out.println(); } static void checkFLOAT() { String UnsignedInt = "([0]|([1-9][0-9]*))"; String SignedInt = "[\\+\\-]?" + UnsignedInt; String UnsignedReal = "(" + UnsignedInt + "\\." + "[0-9]+" + "([eE]" + SignedInt + ")?" + ")"; UnsignedReal += "|(" + UnsignedInt + "[eE]" + SignedInt + ")"; String Number = UnsignedInt + "|" + UnsignedReal; RegexTest reFLOAT = new RegexTest(Number); reFLOAT.assertOk("0"); reFLOAT.assertOk("1"); reFLOAT.assertOk("14"); reFLOAT.assertOk("0.1"); reFLOAT.assertOk("3e4"); reFLOAT.assertOk("3.014e-7"); reFLOAT.assertOk("3.14E-7"); reFLOAT.assertFail("00"); reFLOAT.assertFail("01"); reFLOAT.assertFail("04.1"); reFLOAT.assertFail("3e04"); reFLOAT.assertFail("3.14e-07"); reFLOAT.assertFail(""); reFLOAT.assertFail("e7"); System.out.println(); } static void checkString() { /* String ::= (UnescapedChar | "\" EscapedChar)* * UnescapedChar ::= Char - ["] - "\" * (* All Unicode chars but quote and backslash *) * EscapedChar ::= ["] | "\" */ RegexTest reString = new RegexTest("([^\\\"\\\\]|\\\\[\\\"\\\\])*"); reString.assertOk(""); reString.assertOk("abc"); reString.assertOk("a\\\"b\\\"c"); reString.assertOk("\\\""); reString.assertFail("a\"b\"c"); reString.assertFail("\""); reString.assertFail("\\"); reString.assertFail("\\x"); reString.assertFail("\\\\\""); System.out.println(); } public static void main(String[] args) { checkId(); checkNAT(); checkFLOAT(); checkString(); System.out.println("Passed."); } }