From 8e1ed7da864be5a086c4a9b6ea924ad7104623e3 Mon Sep 17 00:00:00 2001 From: Sebastian Zarnekow Date: Wed, 19 Aug 2015 16:36:46 +0200 Subject: [PATCH] [263773] Continued with flattened grammar approach --- .../src/org/eclipse/xtext/RuleNames.java | 14 ++ .../normalization/GrammarFlatteningTest.xtend | 162 ++++++++++++++++++ 2 files changed, 176 insertions(+) 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) + } }