Merge pull request #715 from eclipse/sz/grammarGenFixes

A few fixes for the Antlr generator 2
This commit is contained in:
Stefan Oehme 2015-10-21 14:52:24 +02:00
commit b3a4d042c1
3 changed files with 20 additions and 16 deletions

View file

@ -49,12 +49,12 @@ abstract class AbstractAntlrGrammarGenerator {
@Inject CodeConfig codeConfig
protected KeywordHelper keyWordHelper
protected KeywordHelper keywordHelper
Grammar originalGrammar
def generate(Grammar it, AntlrOptions options, IXtextGeneratorFileSystemAccess fsa) {
this.keyWordHelper = KeywordHelper.getHelper(it)
this.keywordHelper = KeywordHelper.getHelper(it)
this.originalGrammar = it
val RuleFilter filter = new RuleFilter();
filter.discardUnreachableRules = options.skipUnusedRules
@ -136,7 +136,7 @@ abstract class AbstractAntlrGrammarGenerator {
«IF options.isBacktrackLexer»
tokens {
«FOR kw : allKeywords.sort.sortBy[length]»
«keyWordHelper.getRuleName(kw)»;
«keywordHelper.getRuleName(kw)»;
«ENDFOR»
«FOR rule: allTerminalRules»
«rule.ruleName»;
@ -198,7 +198,7 @@ abstract class AbstractAntlrGrammarGenerator {
«IF options.isBacktrackLexer»
SYNTHETIC_ALL_KEYWORDS :
«FOR kw: allKeywords.indexed»
(FRAGMENT_«keyWordHelper.getRuleName(kw.value)»)=> FRAGMENT_«keyWordHelper.getRuleName(kw.value)» {$type = «keyWordHelper.getRuleName(kw.value)»; }
(FRAGMENT_«keywordHelper.getRuleName(kw.value)»)=> FRAGMENT_«keywordHelper.getRuleName(kw.value)» {$type = «keywordHelper.getRuleName(kw.value)»; }
«IF kw.key != allKeywords.size || !allTerminalRules().isEmpty»|«ENDIF»
«ENDFOR»
«FOR rule : allTerminalRules.indexed»
@ -209,7 +209,7 @@ abstract class AbstractAntlrGrammarGenerator {
«ENDFOR»
;
«FOR kw: allKeywords»
fragment FRAGMENT_«keyWordHelper.getRuleName(kw)» : '«kw.toAntlrString()»';
fragment FRAGMENT_«keywordHelper.getRuleName(kw)» : '«kw.toAntlrString()»';
«ENDFOR»
«ELSE»
«FOR rule:allKeywords»
@ -254,12 +254,16 @@ abstract class AbstractAntlrGrammarGenerator {
«ENDIF»
'''
protected def dispatch compileRule(String keyWord, Grammar grammar, AntlrOptions options) '''
«keyWordHelper.getRuleName(keyWord)» : «keyWord.toAntlrKeyWordRule(options)»;
protected def dispatch compileRule(String keyword, Grammar grammar, AntlrOptions options) '''
«keywordHelper.getRuleName(keyword)» : «keyword.toAntlrKeywordRule(options)»;
'''
protected def toAntlrKeyWordRule(String keyWord, AntlrOptions options) {
"'" + if (options.ignoreCase) keyWord.toAntlrStringIgnoreCase else keyWord.toAntlrString + "'"
protected def toAntlrKeywordRule(String keyword, AntlrOptions options) {
if (options.ignoreCase) {
return keyword.toAntlrStringIgnoreCase
} else {
return "'" + keyword.toAntlrString + "'"
}
}
protected def shouldBeSkipped(TerminalRule it, Grammar grammar) {
@ -321,7 +325,7 @@ abstract class AbstractAntlrGrammarGenerator {
'''
protected dispatch def String dataTypeEbnf2(Keyword it, boolean supportActions) {
if (combinedGrammar) "'" + value.toAntlrString + "'" else keyWordHelper.getRuleName(value)
if (combinedGrammar) "'" + value.toAntlrString + "'" else keywordHelper.getRuleName(value)
}
protected dispatch def String dataTypeEbnf2(RuleCall it, boolean supportActions) {
@ -351,7 +355,7 @@ abstract class AbstractAntlrGrammarGenerator {
}
protected dispatch def String ebnf2(Keyword it, AntlrOptions options, boolean supportActions) {
if (combinedGrammar) "'" + value.toAntlrString + "'" else keyWordHelper.getRuleName(value)
if (combinedGrammar) "'" + value.toAntlrString + "'" else keywordHelper.getRuleName(value)
}
protected dispatch def String ebnf2(RuleCall it, AntlrOptions options, boolean supportActions) {
@ -359,7 +363,7 @@ abstract class AbstractAntlrGrammarGenerator {
}
protected dispatch def String ebnf2(EnumLiteralDeclaration it, AntlrOptions options, boolean supportActions) {
if (combinedGrammar) "'" + literal.value.toAntlrString + "'" else keyWordHelper.getRuleName(literal.value)
if (combinedGrammar) "'" + literal.value.toAntlrString + "'" else keywordHelper.getRuleName(literal.value)
}
protected dispatch def String crossrefEbnf(AbstractElement it, CrossReference ref, boolean supportActions) {

View file

@ -44,7 +44,7 @@ class AntlrContentAssistGrammarGenerator extends AbstractAntlrGrammarWithActions
{
«FOR kw: allKeywords.sort.sortBy[-length]»
tokenNameToValue.put("«keyWordHelper.getRuleName(kw)»", "'«kw.toJavaIdentifier(false).replaceAll("\\\\\\$", "\\\\u0024")»'");
tokenNameToValue.put("«keywordHelper.getRuleName(kw)»", "'«kw.toJavaIdentifier(false).replaceAll("\\\\\\$", "\\\\u0024")»'");
«ENDFOR»
}
«ENDIF»

View file

@ -80,16 +80,16 @@ class XtextAntlrGeneratorFragment2 extends AbstractAntlrGeneratorFragment2 {
override protected doGenerate() {
new KeywordHelper(grammar, options.ignoreCase, grammarUtil)
new CombinedGrammarMarker(isCombinedGrammar).attachToEmfObject(grammar)
if (debugGrammar)
generateDebugGrammar
generateProductionGrammar
if (projectConfig.genericIde.srcGen != null)
generateContentAssistGrammar
if (debugGrammar)
generateDebugGrammar
generateProductionParser.writeTo(projectConfig.runtime.srcGen)
generateAntlrTokenFileProvider.writeTo(projectConfig.runtime.srcGen)
generateContentAssistParser.writeTo(projectConfig.genericIde.srcGen)
if (!isCombinedGrammar) {
if (!isCombinedGrammar && grammar.allTerminalRules().exists[ isSyntheticTerminalRule ]) {
generateProductionTokenSource.writeTo(projectConfig.runtime.srcGen)
generateContentAssistTokenSource.writeTo(projectConfig.genericIde.srcGen)
}