From 31a3b595765b8cb6bb5a57a7f01c4e7cbcede482 Mon Sep 17 00:00:00 2001 From: Terence Parr Date: Mon, 19 May 2014 17:53:50 -0700 Subject: [PATCH] Templates LL1PlusBlock and LL1StarBlock were not used. removed. added test for LL1OptionalBlock. --- .../v4/tool/templates/codegen/Java/Java.stg | 34 -------- .../org/antlr/v4/codegen/ParserFactory.java | 8 +- .../antlr/v4/codegen/model/LL1PlusBlock.java | 80 ------------------- .../antlr/v4/codegen/model/LL1StarBlock.java | 70 ---------------- .../org/antlr/v4/test/TestParserExec.java | 19 ++++- 5 files changed, 20 insertions(+), 191 deletions(-) delete mode 100644 tool/src/org/antlr/v4/codegen/model/LL1PlusBlock.java delete mode 100644 tool/src/org/antlr/v4/codegen/model/LL1StarBlock.java diff --git a/tool/resources/org/antlr/v4/tool/templates/codegen/Java/Java.stg b/tool/resources/org/antlr/v4/tool/templates/codegen/Java/Java.stg index 7e0c88dcd..f6286f0f6 100644 --- a/tool/resources/org/antlr/v4/tool/templates/codegen/Java/Java.stg +++ b/tool/resources/org/antlr/v4/tool/templates/codegen/Java/Java.stg @@ -448,23 +448,6 @@ if () { ) ) !> >> -LL1StarBlock(choice, alts) ::= << -setState(); -_errHandler.sync(this); -: -while (true) { - switch (_input.LA(1)) { - - - break;}; separator="\n"> - - break ; - } - setState(); - _errHandler.sync(this); -} ->> - LL1StarBlockSingleAlt(choice, loopExpr, alts, preamble, iteration) ::= << setState(); _errHandler.sync(this); @@ -477,23 +460,6 @@ while () { } >> -LL1PlusBlock(choice, alts, iteration, loopExpr, error) ::= << -setState(); -_errHandler.sync(this); -do { - switch (_input.LA(1)) { - - - break;}; separator="\n"> - default: - - } - setState(); - _errHandler.sync(this); - -} while ( ); ->> - LL1PlusBlockSingleAlt(choice, loopExpr, alts, preamble, iteration) ::= << setState(); _errHandler.sync(this); diff --git a/tool/src/org/antlr/v4/codegen/ParserFactory.java b/tool/src/org/antlr/v4/codegen/ParserFactory.java index 0953aaab0..e19155407 100644 --- a/tool/src/org/antlr/v4/codegen/ParserFactory.java +++ b/tool/src/org/antlr/v4/codegen/ParserFactory.java @@ -41,9 +41,7 @@ import org.antlr.v4.codegen.model.InvokeRule; import org.antlr.v4.codegen.model.LL1AltBlock; import org.antlr.v4.codegen.model.LL1OptionalBlock; import org.antlr.v4.codegen.model.LL1OptionalBlockSingleAlt; -import org.antlr.v4.codegen.model.LL1PlusBlock; import org.antlr.v4.codegen.model.LL1PlusBlockSingleAlt; -import org.antlr.v4.codegen.model.LL1StarBlock; import org.antlr.v4.codegen.model.LL1StarBlockSingleAlt; import org.antlr.v4.codegen.model.LabeledOp; import org.antlr.v4.codegen.model.LeftRecursiveRuleFunction; @@ -286,12 +284,10 @@ public class ParserFactory extends DefaultOutputModelFactory { else c = new LL1OptionalBlock(this, ebnfRoot, alts); break; case ANTLRParser.CLOSURE : - if ( alts.size()==1 ) c = new LL1StarBlockSingleAlt(this, ebnfRoot, alts); - else c = new LL1StarBlock(this, ebnfRoot, alts); + c = new LL1StarBlockSingleAlt(this, ebnfRoot, alts); break; case ANTLRParser.POSITIVE_CLOSURE : - if ( alts.size()==1 ) c = new LL1PlusBlockSingleAlt(this, ebnfRoot, alts); - else c = new LL1PlusBlock(this, ebnfRoot, alts); + c = new LL1PlusBlockSingleAlt(this, ebnfRoot, alts); break; } return c; diff --git a/tool/src/org/antlr/v4/codegen/model/LL1PlusBlock.java b/tool/src/org/antlr/v4/codegen/model/LL1PlusBlock.java deleted file mode 100644 index 2c4f27aee..000000000 --- a/tool/src/org/antlr/v4/codegen/model/LL1PlusBlock.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * [The "BSD license"] - * Copyright (c) 2012 Terence Parr - * Copyright (c) 2012 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package org.antlr.v4.codegen.model; - -import org.antlr.v4.codegen.CodeGenerator; -import org.antlr.v4.codegen.OutputModelFactory; -import org.antlr.v4.runtime.atn.PlusBlockStartState; -import org.antlr.v4.runtime.misc.IntervalSet; -import org.antlr.v4.tool.Grammar; -import org.antlr.v4.tool.ast.GrammarAST; - -import java.util.List; - -/** */ -public class LL1PlusBlock extends LL1Loop { - /** Token names for each alt 0..n-1 */ - public List altLook; - - public String loopLabel; - public String loopCounterVar; - public String[] exitLook; - - @ModelElement public ThrowNoViableAlt error; - - public LL1PlusBlock(OutputModelFactory factory, GrammarAST plusRoot, List alts) { - super(factory, plusRoot, alts); - - PlusBlockStartState blkStart = (PlusBlockStartState)plusRoot.atnState; - - stateNumber = blkStart.loopBackState.stateNumber; - blockStartStateNumber = blkStart.stateNumber; - - this.decision = blkStart.decision; - Grammar g = factory.getGrammar(); - CodeGenerator gen = factory.getGenerator(); - /** Lookahead for each alt 1..n */ - IntervalSet[] altLookSets = g.decisionLOOK.get(decision); - altLook = getAltLookaheadAsStringLists(altLookSets); - IntervalSet all = IntervalSet.or(altLookSets); - - this.error = getThrowNoViableAlt(factory, plusRoot, all); - - loopExpr = addCodeForLoopLookaheadTempVar(all); - - loopLabel = gen.getTarget().getLoopLabel(plusRoot); - loopCounterVar = gen.getTarget().getLoopCounter(plusRoot); - - IntervalSet exitLookSet = altLookSets[altLookSets.length-1]; - this.exitLook = gen.getTarget().getTokenTypesAsTargetLabels(g, - exitLookSet.toArray()); - } -} diff --git a/tool/src/org/antlr/v4/codegen/model/LL1StarBlock.java b/tool/src/org/antlr/v4/codegen/model/LL1StarBlock.java deleted file mode 100644 index 1995af507..000000000 --- a/tool/src/org/antlr/v4/codegen/model/LL1StarBlock.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * [The "BSD license"] - * Copyright (c) 2012 Terence Parr - * Copyright (c) 2012 Sam Harwell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package org.antlr.v4.codegen.model; - -import org.antlr.v4.codegen.OutputModelFactory; -import org.antlr.v4.runtime.atn.StarLoopEntryState; -import org.antlr.v4.runtime.misc.IntervalSet; -import org.antlr.v4.tool.ast.GrammarAST; - -import java.util.Arrays; -import java.util.List; - -/** */ -public class LL1StarBlock extends LL1Loop { - /** Token names for each alt 0..n-1 */ - public List altLook; - public String loopLabel; - public String[] exitLook; - - public LL1StarBlock(OutputModelFactory factory, GrammarAST starRootAST, List alts) { - super(factory, starRootAST, alts); - - StarLoopEntryState star = (StarLoopEntryState)starRootAST.atnState; - blockStartStateNumber = - starRootAST.atnState.transition(0).target.stateNumber; - - loopBackStateNumber = star.loopBackState.stateNumber; - - this.decision = star.decision; - - /** Lookahead for each alt 1..n */ - IntervalSet[] altLookSets = factory.getGrammar().decisionLOOK.get(decision); - IntervalSet lastLook = altLookSets[altLookSets.length-1]; - // remove last (exit) alt - altLookSets = Arrays.copyOf(altLookSets, altLookSets.length - 1); - altLook = getAltLookaheadAsStringLists(altLookSets); - loopLabel = factory.getGenerator().getTarget().getLoopLabel(starRootAST); - - this.exitLook = - factory.getGenerator().getTarget().getTokenTypesAsTargetLabels(factory.getGrammar(), lastLook.toArray()); - } -} diff --git a/tool/test/org/antlr/v4/test/TestParserExec.java b/tool/test/org/antlr/v4/test/TestParserExec.java index c61f7c09e..8cba297b3 100644 --- a/tool/test/org/antlr/v4/test/TestParserExec.java +++ b/tool/test/org/antlr/v4/test/TestParserExec.java @@ -33,7 +33,8 @@ package org.antlr.v4.test; import org.junit.Ignore; import org.junit.Test; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; /** Test parser execution. * @@ -205,6 +206,22 @@ public class TestParserExec extends BaseTest { assertEquals("abc\n", found); } + @Test public void testLL1OptionalBlock() throws Exception { + String grammar = + "grammar T;\n" + + "a : (ID|{}INT)? {System.out.println($text);} ;\n" + + "ID : 'a'..'z'+ ;\n" + + "INT : '0'..'9'+ ;\n" + + "WS : (' '|'\\n') -> skip ;\n"; + + String found = execParser("T.g4", grammar, "TParser", "TLexer", "a", + "", false); + assertEquals("\n", found); + found = execParser("T.g4", grammar, "TParser", "TLexer", "a", + "a", false); + assertEquals("a\n", found); + } + // force complex decision @Test public void testAorAStar() throws Exception { String grammar =