package FDA;
import Common.ErrorHandler;
import Tools.Console;
import Tools.FileIterator;
import java.util.ArrayList;
import java.util.List;
public abstract class FDA{
private State root;
private boolean debug = false;
private FileIterator iterator;
private FDADatapreviousData;
private boolean continueOnError = true;
public abstract void onReadSequence(FinalStatefinalState, List readSequence);
public State getRoot() {
return root;
}
public void setRoot(State root) {
this.root = root;
}
public boolean isDebug() {
return debug;
}
public void setDebug(boolean debug) {
this.debug = debug;
}
public void execute(FileIterator iterator){
this.iterator = iterator;
if(debug){
Console.printLegend();
}
Console.printlnInfo("FDA","Executing");
do{}while(executeNext());
}
public boolean executeNext(){
if(previousData==null){
if(iterator.hasNext()){
previousData = root.feedForward(this,null,new ArrayList<>(),null,debug);
}else{
return false;
}
}else{
if((iterator.hasNext()||!previousData.getLastTransition().isReadNext())&& previousData.getInternalCode()>0){
previousData = root.feedForward(this,previousData.getLastTransition(),new ArrayList<>(),previousData.getLastElement(),debug);
}else{
return false;
}
}
if(previousData.getInternalCode()>0){
return true;
}else{
return false;
}
}
protected boolean onError(ProcessorError exception){
printOnFinish(debug,false,iterator.getCurrentElement().toString());
ErrorHandler.showLexicError(getIterator(),exception);
if(continueOnError){
try {
getIterator().skipLine();
if(debug)Console.print(Console.ANSI_RED+"[Skipped line]");
return true;
}catch(Exception e){
return false;
}
}else{
return false;
}
}
protected void printOnFinish(boolean debug, boolean valid, String value){
if(debug){
if(valid){
Console.print(Console.ANSI_GREEN+"VALID\n");
}else{
Console.printCharacter(true,value);
Console.print(Console.ANSI_RED+"ERROR\n");
}
}
}
public FileIterator getIterator() {
return iterator;
}
public void setIterator(FileIterator iterator) {
this.iterator = iterator;
}
public boolean isContinueOnError() {
return continueOnError;
}
public void setContinueOnError(boolean continueOnError) {
this.continueOnError = continueOnError;
}
}