From fd878a4f7be0a210aed0f12f503e659caeced664 Mon Sep 17 00:00:00 2001 From: hneemann Date: Thu, 29 Jun 2017 20:29:40 +0200 Subject: [PATCH] expression parser allows to omit the and operator --- .../digital/analyse/parser/Parser.java | 16 ++++++++++---- .../digital/analyse/parser/ParserTest.java | 21 +++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/neemann/digital/analyse/parser/Parser.java b/src/main/java/de/neemann/digital/analyse/parser/Parser.java index 4e9f3881b..d835883af 100644 --- a/src/main/java/de/neemann/digital/analyse/parser/Parser.java +++ b/src/main/java/de/neemann/digital/analyse/parser/Parser.java @@ -83,11 +83,19 @@ public class Parser { private Expression parseAnd() throws IOException, ParseException { Expression ex = parseSimpleExp(); - while (tokenizer.peek() == AND) { - tokenizer.consume(); - ex = Operation.and(ex, parseSimpleExp()); + while (true) { + if (tokenizer.peek() == AND) { + tokenizer.consume(); + ex = Operation.and(ex, parseSimpleExp()); + } else if (isSimpleEx(tokenizer.peek())) { + ex = Operation.and(ex, parseSimpleExp()); + } else + return ex; } - return ex; + } + + private boolean isSimpleEx(Tokenizer.Token tok) { + return tok == NOT || tok == OPEN || tok == IDENT || tok == ONE || tok == ZERO; } private Expression parseSimpleExp() throws IOException, ParseException { diff --git a/src/test/java/de/neemann/digital/analyse/parser/ParserTest.java b/src/test/java/de/neemann/digital/analyse/parser/ParserTest.java index 41a794fda..50abc7ab3 100644 --- a/src/test/java/de/neemann/digital/analyse/parser/ParserTest.java +++ b/src/test/java/de/neemann/digital/analyse/parser/ParserTest.java @@ -47,6 +47,7 @@ public class ParserTest extends TestCase { assertTrue(createSingle("a∧b") instanceof Operation.And); assertTrue(createSingle("a&b") instanceof Operation.And); assertTrue(createSingle("a&&b") instanceof Operation.And); + assertTrue(createSingle("a b") instanceof Operation.And); } public void testParseParenthesis() throws Exception { @@ -100,6 +101,16 @@ public class ParserTest extends TestCase { assertEquals(new Variable("B"), simplified); } + public void testParseRegressionOmitAnd() throws Exception { + Expression e = createSingle("B(B+A)(B+C)(A+B+C)"); + Expression simplified = QuineMcCluskey.simplify(e); + assertEquals(new Variable("B"), simplified); + + e = createSingle("B (B+A) (B+C) (A+B+C)"); + simplified = QuineMcCluskey.simplify(e); + assertEquals(new Variable("B"), simplified); + } + public void testParseRegression2() throws Exception { Expression e = createSingle("(C ∨ B) ∧ (A ∨ C) ∧ (B ∨ ¬C) ∧ (C ∨ ¬A)"); Expression simplified = QuineMcCluskey.simplify(e); @@ -110,6 +121,16 @@ public class ParserTest extends TestCase { assertEquals(new Variable("C"), expList.get(1)); } + public void testParseRegression2OmitAnd() throws Exception { + Expression e = createSingle("(C ∨ B) (A ∨ C) (B ∨ ¬C) (C ∨ ¬A)"); + Expression simplified = QuineMcCluskey.simplify(e); + assertTrue(simplified instanceof Operation.And); + ArrayList expList = ((Operation) simplified).getExpressions(); + assertEquals(2, expList.size()); + assertEquals(new Variable("B"), expList.get(0)); + assertEquals(new Variable("C"), expList.get(1)); + } + public void testParseException() throws Exception { Parser p = new Parser("C+"); try {