mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-16 16:58:56 +00:00
Turn off lexer special state switching by default
and provide option to turn it explicitly on Signed-off-by: Jan Sebechlebsky <jan.sebechlebsky@cz.ibm.com>
This commit is contained in:
parent
a63bc3acd7
commit
6bd52aa67e
4 changed files with 47 additions and 1 deletions
|
@ -10,6 +10,7 @@ package org.eclipse.xtext.xtext.generator.parser.antlr
|
|||
import org.eclipse.xtend.lib.annotations.Accessors
|
||||
import org.eclipse.xtext.xtext.generator.parser.antlr.splitting.AntlrParserSplitter
|
||||
import org.eclipse.xtext.xtext.generator.parser.antlr.splitting.PartialClassExtractor
|
||||
import org.eclipse.xtext.xtext.generator.parser.antlr.splitting.internal.LexerSpecialStateTransitionSplitter
|
||||
|
||||
@Accessors
|
||||
class AntlrOptions {
|
||||
|
@ -19,10 +20,13 @@ class AntlrOptions {
|
|||
int k = -1
|
||||
boolean ignoreCase = false
|
||||
boolean classSplitting = false
|
||||
boolean specialStateSwitchSplitting = false
|
||||
@Accessors(PUBLIC_GETTER)
|
||||
int fieldsPerClass = AntlrParserSplitter.FIELDS_PER_CLASS
|
||||
@Accessors(PUBLIC_GETTER)
|
||||
int methodsPerClass = PartialClassExtractor.METHODS_PER_CLASS
|
||||
@Accessors(PUBLIC_GETTER)
|
||||
int casesPerSpecialStateSwitch = LexerSpecialStateTransitionSplitter.CASES_PER_SPECIAL_STATE_SWITCH
|
||||
boolean skipUnusedRules = false
|
||||
boolean optimizeCodeQuality = true
|
||||
boolean stripAllComments = false
|
||||
|
@ -36,6 +40,10 @@ class AntlrOptions {
|
|||
def void setMethodsPerClass(String methodsPerClass) {
|
||||
this.methodsPerClass = Integer.parseInt(methodsPerClass)
|
||||
}
|
||||
|
||||
def void setCasesPerSpecialStateSwitch(String casesPerSpecialStateSwitch) {
|
||||
this.casesPerSpecialStateSwitch = Integer.parseInt(casesPerSpecialStateSwitch)
|
||||
}
|
||||
|
||||
def void setKAsString(String k) {
|
||||
this.k = Integer.parseInt(k)
|
||||
|
|
|
@ -45,6 +45,7 @@ public class AntlrLexerSplitter {
|
|||
private final Scanner scanner;
|
||||
|
||||
private boolean allowDFAStaticClasses = true;
|
||||
private boolean specialStateSwitchSplitting = false;
|
||||
|
||||
private int casesPerSpecialStateSwitch = LexerSpecialStateTransitionSplitter.CASES_PER_SPECIAL_STATE_SWITCH;
|
||||
|
||||
|
@ -77,6 +78,7 @@ public class AntlrLexerSplitter {
|
|||
LexerSpecialStateTransitionSplitter lexerSplitter;
|
||||
lexerSplitter = new LexerSpecialStateTransitionSplitter(false);
|
||||
lexerSplitter.setAllowDFAStaticClasses(allowDFAStaticClasses);
|
||||
lexerSplitter.setSpecialStateSwitchSplitting(specialStateSwitchSplitting);
|
||||
lexerSplitter.setCasesPerSpecialStateSwitch(casesPerSpecialStateSwitch);
|
||||
result = lexerSplitter.transform(result);
|
||||
return result;
|
||||
|
@ -236,6 +238,20 @@ public class AntlrLexerSplitter {
|
|||
this.allowDFAStaticClasses = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 2.9
|
||||
*/
|
||||
public boolean isSpecialStateSwitchSplitting() {
|
||||
return specialStateSwitchSplitting;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 2.9
|
||||
*/
|
||||
public void setSpecialStateSwitchSplitting(boolean value) {
|
||||
this.specialStateSwitchSplitting = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 2.9
|
||||
*/
|
||||
|
|
|
@ -69,6 +69,8 @@ public class LexerSpecialStateTransitionSplitter {
|
|||
|
||||
private boolean allowDFAStaticClasses = true;
|
||||
|
||||
private boolean specialStateSwitchSplitting = false;
|
||||
|
||||
private int casesPerSpecialStateSwitch = CASES_PER_SPECIAL_STATE_SWITCH;
|
||||
|
||||
public LexerSpecialStateTransitionSplitter(boolean ignoreCaseCountGuard) {
|
||||
|
@ -84,7 +86,12 @@ public class LexerSpecialStateTransitionSplitter {
|
|||
if (allowDFAStaticClasses && !STATE_PATTERN.matcher(specialStateTransition).find())
|
||||
staticOrNot = "static $1";
|
||||
String tmpSpecialStateTransition = extractSpecialStateMethods(specialStateTransition);
|
||||
String transformedDfa = staticOrNot + splitSpecialStateSwitch(tmpSpecialStateTransition) + "$3";
|
||||
String transformedDfa;
|
||||
if(specialStateSwitchSplitting){
|
||||
transformedDfa = staticOrNot + splitSpecialStateSwitch(tmpSpecialStateTransition) + "$3";
|
||||
}else{
|
||||
transformedDfa = staticOrNot + tmpSpecialStateTransition + "$3";
|
||||
}
|
||||
dfaMatcher.appendReplacement(result, transformedDfa);
|
||||
}
|
||||
dfaMatcher.appendTail(result);
|
||||
|
@ -214,6 +221,20 @@ public class LexerSpecialStateTransitionSplitter {
|
|||
this.allowDFAStaticClasses = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 2.9
|
||||
*/
|
||||
public boolean isSpecialStateSwitchSplitting() {
|
||||
return specialStateSwitchSplitting;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 2.9
|
||||
*/
|
||||
public void setSpecialStateSwitchSplitting(boolean value) {
|
||||
this.specialStateSwitchSplitting = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 2.9
|
||||
*/
|
||||
|
|
|
@ -329,6 +329,7 @@ public class LexerSpecialStateTransitionSplitterTest extends Assert {
|
|||
@Test public void testSpecialStateSwitchTransformation(){
|
||||
int tmpCasesLimit = testMe.getCasesPerSpecialStateSwitch();
|
||||
|
||||
testMe.setSpecialStateSwitchSplitting(true);
|
||||
testMe.setCasesPerSpecialStateSwitch(3);
|
||||
String actualSpecialStateSwitchSplit = testMe.transform(original);
|
||||
assertEquals(transformedSpecialStateSplit,actualSpecialStateSwitchSplit);
|
||||
|
|
Loading…
Reference in a new issue