mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-16 08:48:55 +00:00
[generator] fixed some issues in lexer generator
This commit is contained in:
parent
076807b17b
commit
db160aa5a6
4 changed files with 41 additions and 24 deletions
|
@ -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»
|
||||
|
|
|
@ -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»
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue