[generator] fixed some issues in lexer generator

This commit is contained in:
Sven Efftinge 2015-11-13 15:10:01 +01:00
parent 2d24d81e08
commit ebbfab2120
4 changed files with 41 additions and 24 deletions

View file

@ -677,7 +677,7 @@ class IdeaPluginGenerator extends AbstractStubGeneratingFragment {
«IF rule.named»
return new «'org.eclipse.xtext.psi.impl.PsiNamedEObjectImpl'.typeRef»(node) {};
«ELSE»
return new «'org.eclipse.xtext.psi.impl.PsiEObjectImpl'»(node) {};
return new «'org.eclipse.xtext.psi.impl.PsiEObjectImpl'.typeRef»(node) {};
«ENDIF»
}
«FOR element : rule.EObjectElements»
@ -685,7 +685,7 @@ class IdeaPluginGenerator extends AbstractStubGeneratingFragment {
«IF element.named»
return new «'org.eclipse.xtext.psi.impl.PsiNamedEObjectImpl'.typeRef»(node) {};
«ELSE»
return new «'org.eclipse.xtext.psi.impl.PsiEObjectImpl'»(node) {};
return new «'org.eclipse.xtext.psi.impl.PsiEObjectImpl'.typeRef»(node) {};
«ENDIF»
}
«ENDFOR»

View file

@ -94,6 +94,8 @@ abstract class AbstractAntlrGrammarGenerator {
«compileTokens(options)»
«compileLexerHeader(options)»
«compileKeywordRules(options)»
// Rules duplicated to allow inter-rule references
«compileTerminalRules(options)»
'''
@ -196,22 +198,28 @@ abstract class AbstractAntlrGrammarGenerator {
val allKeywords = allKeywords.sort.sortBy[-length]
val allTerminalRules = allTerminalRules
val synthetic_kw_alternatives = newArrayList
synthetic_kw_alternatives.addAll(allKeywords.indexed.map[
val ruleName = keywordHelper.getRuleName(value)
return '''(FRAGMENT_«ruleName»)=> FRAGMENT_«ruleName» {$type = «ruleName»; }'''
])
synthetic_kw_alternatives.addAll(allTerminalRules.indexed.map[
if (!isSyntheticTerminalRule(value) && !value.fragment) {
return '''(FRAGMENT_«value.ruleName»)=> FRAGMENT_«value.ruleName» {$type = «value.ruleName»; }'''
}
].filterNull.toList)
'''
«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)»; }
«IF kw.key != allKeywords.size || !allTerminalRules().isEmpty»|«ENDIF»
«ENDFOR»
«FOR rule : allTerminalRules.indexed»
«IF !isSyntheticTerminalRule(rule.value) && !rule.value.fragment»
(FRAGMENT_«rule.value.ruleName()»)=> FRAGMENT_«rule.value.ruleName()» {$type = «rule.value.ruleName()»; }
«IF rule.key != allTerminalRules.size»|«ENDIF»
«ENDIF»
«ENDFOR»
«FOR kw: synthetic_kw_alternatives SEPARATOR ' |'»
«kw»
«ENDFOR»
;
«FOR kw: allKeywords»
fragment FRAGMENT_«keywordHelper.getRuleName(kw)» : '«kw.toAntlrString()»';
«ENDFOR»
«ELSE»
«FOR rule:allKeywords»

View file

@ -97,14 +97,13 @@ Workflow {
// name = "org.eclipse.xtext.XtextGrammarTestLanguage"
// }
// language = TestLanguage {
// parserGenerator = {
// options = {
// backtrack = true
// backtrackLexer = true
// memoize = true
// }
// }
// name = "org.eclipse.xtext.lexer.BacktrackingLexerTestLanguage"
// parserOptions = {
// backtrack = true
// backtrackLexer = true
// memoize = true
// classSplitting = true
// }
// }
//
// language = TestLanguage {

View file

@ -26,19 +26,29 @@ import org.eclipse.xtext.generator.parser.antlr.AntlrOptions
@Accessors
class TestLanguage extends XtextGeneratorLanguage {
org.eclipse.xtext.xtext.generator.parser.antlr.AntlrOptions parserOptions = new org.eclipse.xtext.xtext.generator.parser.antlr.AntlrOptions() => [
classSplitting = true
]
def void setParserOptions(org.eclipse.xtext.xtext.generator.parser.antlr.AntlrOptions parserOptions) {
this.parserOptions = parserOptions
parserGenerator.options = parserOptions
ideaParser.options = parserOptions
}
GrammarAccessFragment2 grammarAccess = new GrammarAccessFragment2
SerializerFragment2 serializer = new SerializerFragment2 => [
generateStub = true
generateStub = false
]
ResourceFactoryFragment2 resourceFactoryFragment = new ResourceFactoryFragment2
EMFGeneratorFragment2 emfGenerator = new EMFGeneratorFragment2
XtextAntlrGeneratorFragment2 parserGenerator = new XtextAntlrGeneratorFragment2 => [
debugGrammar = true
options => [
classSplitting = true
]
options = parserOptions
]
XtextAntlrIDEAGeneratorFragment ideaParser = new XtextAntlrIDEAGeneratorFragment => [
options = parserOptions
]
XtextAntlrIDEAGeneratorFragment ideaParser = new XtextAntlrIDEAGeneratorFragment
IdeaPluginGenerator ideaPlugin = new IdeaPluginGenerator