/* * provide names and student id numbers here */ 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("3.14e-7"); reFLOAT.assertFail("3.14e-07"); reFLOAT.assertOk("1"); reFLOAT.assertOk("0.1"); reFLOAT.assertOk("3e4"); reFLOAT.assertFail("00"); reFLOAT.assertFail("01s"); reFLOAT.assertFail("Id"); reFLOAT.assertFail("-145711"); reFLOAT.assertFail("04.1"); 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."); } }