From 2726ec0e09451505884673b10f5597805735a186 Mon Sep 17 00:00:00 2001 From: overflowerror Date: Fri, 17 Dec 2021 21:52:25 +0100 Subject: [PATCH] removed unnecessary parenthesis from rendered output --- .../generator/parser/antlr/JavaCodeUtils.java | 16 +++++++++ .../antlr/hoisting/HoistingProcessor.java | 9 +++-- .../guards/AlternativeTokenSequenceGuard.java | 35 ++++++++++--------- .../hoisting/guards/MergedPathGuard.java | 14 ++++---- .../antlr/hoisting/guards/PathGuard.java | 21 +++++++++-- .../hoisting/guards/SingleTokenGuard.java | 5 +++ .../antlr/hoisting/guards/TokenGuard.java | 2 ++ .../hoisting/guards/TokenSequenceGuard.java | 19 ++++++++-- 8 files changed, 90 insertions(+), 31 deletions(-) diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/JavaCodeUtils.java b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/JavaCodeUtils.java index 4d2b9e9e6..5f409a2e5 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/JavaCodeUtils.java +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/JavaCodeUtils.java @@ -9,6 +9,7 @@ package org.eclipse.xtext.xtext.generator.parser.antlr; import org.eclipse.xtext.JavaCode; +import org.eclipse.xtext.xtext.generator.parser.antlr.hoisting.guards.Guard; /** * @author overflow - Initial contribution and API @@ -18,4 +19,19 @@ public class JavaCodeUtils { String source = code.getSource(); return source.substring(2, source.length() - 2); } + + static public String formatCodeForGrammar(String code) { + return "$$ " + code + " $$"; + } + + static public String formatPredicateForGrammar(String predicate) { + return formatCodeForGrammar( + // remove parentheses + predicate.substring(1, predicate.length() - 1) + ); + } + + static public String formatGuardForGrammar(Guard guard) { + return formatPredicateForGrammar(guard.render()); + } } diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/HoistingProcessor.java b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/HoistingProcessor.java index 2d325419e..cc7cf70d8 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/HoistingProcessor.java +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/HoistingProcessor.java @@ -39,6 +39,7 @@ import org.eclipse.xtext.util.Tuples; import static org.eclipse.xtext.GrammarUtil.*; +import org.eclipse.xtext.xtext.generator.parser.antlr.JavaCodeUtils; import org.eclipse.xtext.xtext.generator.parser.antlr.hoisting.exceptions.NestedPrefixAlternativesException; import org.eclipse.xtext.xtext.generator.parser.antlr.hoisting.exceptions.OptionalCardinalityWithoutContextException; import org.eclipse.xtext.xtext.generator.parser.antlr.hoisting.exceptions.TokenAnalysisAbortedException; @@ -116,7 +117,7 @@ public class HoistingProcessor { private AbstractElement getNopElement() { JavaCode virtualJavaCodeForAction = XtextFactory.eINSTANCE.createJavaCode(); - virtualJavaCodeForAction.setSource("$$ /* nop */ $$"); + virtualJavaCodeForAction.setSource(JavaCodeUtils.formatCodeForGrammar("/* nop */")); JavaAction virtualNopJavaAction = XtextFactory.eINSTANCE.createJavaAction(); virtualNopJavaAction.setCode(virtualJavaCodeForAction); @@ -145,7 +146,7 @@ public class HoistingProcessor { if (!guard.isTrivial()) { JavaCode virtualJavaCodeForPredicate = XtextFactory.eINSTANCE.createJavaCode(); - virtualJavaCodeForPredicate.setSource("$$ " + guard.render() + " $$"); + virtualJavaCodeForPredicate.setSource(JavaCodeUtils.formatGuardForGrammar(guard)); renderedVirtualPredicate = XtextFactory.eINSTANCE.createGatedSemanticPredicate(); renderedVirtualPredicate.setCode(virtualJavaCodeForPredicate); @@ -234,9 +235,11 @@ public class HoistingProcessor { .collect(Collectors.toList()) ) .map(TokenSequenceGuard::new) + .map(TokenGuard::reduce) .collect(Collectors.toList()) ) - .map(AlternativeTokenSequenceGuard::new), + .map(AlternativeTokenSequenceGuard::new) + .map(TokenGuard::reduce), guards.stream(), (TokenGuard tokenGuard, MergedPathGuard pathGuard) -> Tuples.pair(tokenGuard, pathGuard) ).map(p -> new PathGuard(p.getFirst(), p.getSecond())) diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/AlternativeTokenSequenceGuard.java b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/AlternativeTokenSequenceGuard.java index 8f9829efd..df6485bbb 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/AlternativeTokenSequenceGuard.java +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/AlternativeTokenSequenceGuard.java @@ -16,30 +16,31 @@ import java.util.stream.Collectors; * @author overflow - Initial contribution and API */ public class AlternativeTokenSequenceGuard implements TokenGuard { - private Collection alternatives; + private Collection alternatives; - public AlternativeTokenSequenceGuard(Collection alternatives) { + public AlternativeTokenSequenceGuard(Collection alternatives) { this.alternatives = alternatives; } + public TokenGuard reduce() { + if (alternatives.size() == 1) { + return alternatives.stream().findAny().get(); + } else { + return this; + } + } + @Override public String render() { - boolean addParentheses = alternatives.size() != 1; - String result = ""; - - if (addParentheses) { - result += "("; + if (alternatives.size() != 1) { + return "(" + + alternatives.stream() + .map(TokenGuard::render) + .collect(Collectors.joining(" && ")) + + ")"; + } else { + return alternatives.stream().findAny().get().render(); } - - result += alternatives.stream() - .map(TokenGuard::render) - .collect(Collectors.joining(" && ")); - - if (addParentheses) { - result += ")"; - } - - return result; } @Override diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/MergedPathGuard.java b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/MergedPathGuard.java index 29524e93f..1e1fb293c 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/MergedPathGuard.java +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/MergedPathGuard.java @@ -31,7 +31,7 @@ public class MergedPathGuard implements HoistingGuard { pathGuards.addAll(mergedPathGuard.pathGuards); } - HoistingGuard simplify() { + HoistingGuard reduce() { if (pathGuards.size() == 1) { return pathGuards.get(0); } else { @@ -49,13 +49,15 @@ public class MergedPathGuard implements HoistingGuard { if (pathGuards.size() == 1) { return pathGuards.get(0).render(); } else { - return "(" + - pathGuards.stream() - .map(Guard::render) - .collect(Collectors.joining(" || ")) + - ")"; + return "(" + renderWithoutParentheses() + ")"; } } + + String renderWithoutParentheses() { + return pathGuards.stream() + .map(Guard::render) + .collect(Collectors.joining(" || ")); + } @Override public boolean hasTerminal() { diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/PathGuard.java b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/PathGuard.java index 1eccccfc9..de4305aa0 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/PathGuard.java +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/PathGuard.java @@ -42,7 +42,24 @@ public class PathGuard implements HoistingGuard { @Override public String render() { // parentheses needed since tokenGuard is never empty - return "(" + tokenGuard.render() + " || " + hoistngGuard.render() + ")"; + String result = "("; + + if (tokenGuard instanceof TokenSequenceGuard) { + result += ((TokenSequenceGuard) tokenGuard).renderWithoutParenthesis(); + } else { + result += tokenGuard.render(); + } + + result += " || "; + + if (hoistngGuard instanceof MergedPathGuard) { + result += ((MergedPathGuard) hoistngGuard).renderWithoutParentheses(); + } else { + result += hoistngGuard.render(); + } + + result += ")"; + return result; } public static List collapse(List paths) { @@ -57,7 +74,7 @@ public class PathGuard implements HoistingGuard { // TODO: allow merged paths if (guard instanceof MergedPathGuard) { - guard = ((MergedPathGuard) guard).simplify(); + guard = ((MergedPathGuard) guard).reduce(); } if (guard instanceof AlternativesGuard) { diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/SingleTokenGuard.java b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/SingleTokenGuard.java index 30f285790..205b1fe53 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/SingleTokenGuard.java +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/SingleTokenGuard.java @@ -19,6 +19,11 @@ public class SingleTokenGuard implements TokenGuard { public SingleTokenGuard(Token token) { this.token = token; } + + @Override + public TokenGuard reduce() { + return this; + } @Override public String render() { diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/TokenGuard.java b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/TokenGuard.java index 92c7e73fb..443b300a7 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/TokenGuard.java +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/TokenGuard.java @@ -16,4 +16,6 @@ public interface TokenGuard extends Guard { default boolean isTrivial() { return false; } + + TokenGuard reduce(); } diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/TokenSequenceGuard.java b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/TokenSequenceGuard.java index ecd860369..abf445147 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/TokenSequenceGuard.java +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/guards/TokenSequenceGuard.java @@ -22,6 +22,15 @@ public class TokenSequenceGuard implements TokenGuard { this.sequence = sequence; } + @Override + public TokenGuard reduce() { + if (sequence.size() == 1) { + return sequence.stream().findAny().get(); + } else { + return this; + } + } + @Override public String render() { boolean addParentheses = sequence.size() != 1; @@ -31,9 +40,7 @@ public class TokenSequenceGuard implements TokenGuard { result += "("; } - result += sequence.stream() - .map(TokenGuard::render) - .collect(Collectors.joining(" || ")); + result += renderWithoutParenthesis(); if (addParentheses) { result += ")"; @@ -42,6 +49,12 @@ public class TokenSequenceGuard implements TokenGuard { return result; } + public String renderWithoutParenthesis() { + return sequence.stream() + .map(TokenGuard::render) + .collect(Collectors.joining(" || ")); + } + @Override public String toString() { return "TokenSequenceGuard (\n" +