diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/RuleNames.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/RuleNames.java
index 1faec5221..62e31fa19 100644
--- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/RuleNames.java
+++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/RuleNames.java
@@ -190,6 +190,20 @@ public class RuleNames {
return antlrNameToRule.inverse().get(rule);
}
+ public String getAntlrRuleName(AbstractRule rule, int paramConfig) {
+ String result = antlrNameToRule.inverse().get(rule);
+ int idx;
+ if (result.startsWith("super")) {
+ idx = 5;
+ } else if (result.startsWith("rule")) {
+ idx = 4;
+ } else {
+ throw new IllegalArgumentException(result);
+ }
+ result = "norm" + paramConfig + "_" + result.substring(idx);
+ return result;
+ }
+
public AbstractRule getRuleByAntlrName(String name) {
return antlrNameToRule.get(name);
}
diff --git a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/generator/normalization/GrammarFlatteningTest.xtend b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/generator/normalization/GrammarFlatteningTest.xtend
index 0a192bca1..5ddff3e0b 100644
--- a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/generator/normalization/GrammarFlatteningTest.xtend
+++ b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/generator/normalization/GrammarFlatteningTest.xtend
@@ -110,5 +110,167 @@ class GrammarFlatteningTest extends AbstractXtextTests {
terminal RULE_ANY_OTHER:
.;'''.toString, serialized)
}
+
+ @Test def void test_03() throws Exception {
+ var Grammar flattened = getModel(
+ '''
+ grammar com.foo.bar with org.eclipse.xtext.common.Terminals
+ generate myPack 'http://myURI'
+ Rule: name=ID | name=ID | name=STRING;
+ ''')
+ var String serialized = getSerializer().serialize(flattened)
+ assertEquals('''
+ grammar com.foo.bar hidden(RULE_WS, RULE_ML_COMMENT, RULE_SL_COMMENT)
+
+ norm0_Rule:
+ name=RULE_ID | name=RULE_STRING;
+
+ norm1_Rule:
+ name=RULE_ID | name=RULE_ID | name=RULE_STRING;
+
+ norm2_Rule:
+ name=RULE_STRING;
+
+ norm3_Rule:
+ name=RULE_ID | name=RULE_STRING;
+
+ terminal RULE_ID:
+ "^"? ("a".."z" | "A".."Z" | "_") ("a".."z" | "A".."Z" | "_" | "0".."9")*;
+
+ terminal RULE_INT:
+ "0".."9"+;
+
+ terminal RULE_STRING:
+ "\"" ("\\" . | !("\\" | "\""))* "\"" | "\'" ("\\" . | !("\\" | "\'"))* "\'";
+
+ terminal RULE_ML_COMMENT:
+ "/*"->"*/";
+
+ terminal RULE_SL_COMMENT:
+ "//" !("\n" | "\r")* ("\r"? "\n")?;
+
+ terminal RULE_WS:
+ " " | "\t" | "\r" | "\n"+;
+
+ terminal RULE_ANY_OTHER:
+ .;'''.toString, serialized)
+ }
+
+ @Test def void test_04() throws Exception {
+ var Grammar flattened = getModel(
+ '''
+ grammar com.foo.bar with org.eclipse.xtext.common.Terminals
+ generate myPack 'http://myURI'
+ Rule: name=ID child=Rule?;
+ ''')
+ var String serialized = getSerializer().serialize(flattened)
+ assertEquals('''
+ grammar com.foo.bar hidden(RULE_WS, RULE_ML_COMMENT, RULE_SL_COMMENT)
+
+ norm0_Rule:
+ name=RULE_ID child=norm0_Rule?;
+
+ norm1_Rule:
+ name=RULE_ID child=norm1_Rule?;
+
+ terminal RULE_ID:
+ "^"? ("a".."z" | "A".."Z" | "_") ("a".."z" | "A".."Z" | "_" | "0".."9")*;
+
+ terminal RULE_INT:
+ "0".."9"+;
+
+ terminal RULE_STRING:
+ "\"" ("\\" . | !("\\" | "\""))* "\"" | "\'" ("\\" . | !("\\" | "\'"))* "\'";
+
+ terminal RULE_ML_COMMENT:
+ "/*"->"*/";
+
+ terminal RULE_SL_COMMENT:
+ "//" !("\n" | "\r")* ("\r"? "\n")?;
+
+ terminal RULE_WS:
+ " " | "\t" | "\r" | "\n"+;
+
+ terminal RULE_ANY_OTHER:
+ .;'''.toString, serialized)
+ }
+
+ @Test def void test_05() throws Exception {
+ var Grammar flattened = getModel(
+ '''
+ grammar com.foo.bar with org.eclipse.xtext.common.Terminals
+ generate myPack 'http://myURI'
+ Rule: name=ID (child=Rule|child=Rule+)?;
+ ''')
+ var String serialized = getSerializer().serialize(flattened)
+ assertEquals('''
+ grammar com.foo.bar hidden(RULE_WS, RULE_ML_COMMENT, RULE_SL_COMMENT)
+
+ norm0_Rule:
+ name=RULE_ID child=norm1_Rule*;
+
+ norm1_Rule:
+ name=RULE_ID child=norm1_Rule?;
+
+ terminal RULE_ID:
+ "^"? ("a".."z" | "A".."Z" | "_") ("a".."z" | "A".."Z" | "_" | "0".."9")*;
+
+ terminal RULE_INT:
+ "0".."9"+;
+
+ terminal RULE_STRING:
+ "\"" ("\\" . | !("\\" | "\""))* "\"" | "\'" ("\\" . | !("\\" | "\'"))* "\'";
+
+ terminal RULE_ML_COMMENT:
+ "/*"->"*/";
+
+ terminal RULE_SL_COMMENT:
+ "//" !("\n" | "\r")* ("\r"? "\n")?;
+
+ terminal RULE_WS:
+ " " | "\t" | "\r" | "\n"+;
+
+ terminal RULE_ANY_OTHER:
+ .;'''.toString, serialized)
+ }
+
+ @Test def void test_06() throws Exception {
+ var Grammar flattened = getModel(
+ '''
+ grammar com.foo.bar with org.eclipse.xtext.common.Terminals
+ generate myPack 'http://myURI'
+ Rule: name=ID (child=Rule)?;
+ ''')
+ var String serialized = getSerializer().serialize(flattened)
+ assertEquals('''
+ grammar com.foo.bar hidden(RULE_WS, RULE_ML_COMMENT, RULE_SL_COMMENT)
+
+ norm0_Rule:
+ name=RULE_ID;
+
+ norm1_Rule:
+ name=RULE_ID child=norm0_Rule?;
+
+ terminal RULE_ID:
+ "^"? ("a".."z" | "A".."Z" | "_") ("a".."z" | "A".."Z" | "_" | "0".."9")*;
+
+ terminal RULE_INT:
+ "0".."9"+;
+
+ terminal RULE_STRING:
+ "\"" ("\\" . | !("\\" | "\""))* "\"" | "\'" ("\\" . | !("\\" | "\'"))* "\'";
+
+ terminal RULE_ML_COMMENT:
+ "/*"->"*/";
+
+ terminal RULE_SL_COMMENT:
+ "//" !("\n" | "\r")* ("\r"? "\n")?;
+
+ terminal RULE_WS:
+ " " | "\t" | "\r" | "\n"+;
+
+ terminal RULE_ANY_OTHER:
+ .;'''.toString, serialized)
+ }
}