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:
Jan Sebechlebsky 2015-11-09 18:56:18 +01:00
parent a63bc3acd7
commit 6bd52aa67e
4 changed files with 47 additions and 1 deletions

View file

@ -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)

View file

@ -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
*/

View file

@ -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
*/

View file

@ -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);