package jflex.core;
import java.io.File;
import java.io.IOException;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
import java.util.Set;
import java_cup.runtime.Symbol;
import jflex.core.unicode.CharClasses;
import jflex.core.unicode.ILexScan;
import jflex.core.unicode.UnicodeProperties;
import jflex.l10n.ErrorMessages;
import jflex.logging.Out;
import jflex.scanner.LexicalStates;
import jflex.scanner.ScannerException;
public abstract class AbstractLexScan implements ILexScan {
int bufferSize = 16384;
File file;
private final Deque<File> files = new ArrayDeque<>();
StringBuilder userCode = new StringBuilder();
String classCode;
String initCode;
String initThrow;
String eofCode;
String eofThrow;
String lexThrow;
String eofVal;
public String scanErrorException;
String cupSymbol = "sym";
StringBuilder string = new StringBuilder();
@SuppressWarnings("WeakerAccess")
UnicodeProperties unicodeProperties;
boolean charCount;
boolean lineCount;
boolean columnCount;
boolean cupCompatible;
boolean cup2Compatible;
boolean cupDebug;
boolean isInteger;
boolean isIntWrap;
boolean isPublic;
boolean isFinal;
boolean isAbstract;
boolean bolUsed;
boolean standalone;
boolean debugOption;
boolean eofclose;
String isImplementing;
String isExtending;
String className = "Yylex";
String functionName;
String tokenType;
String visibility = "public";
List<String> ctorArgs = new ArrayList<>();
List<String> ctorTypes = new ArrayList<>();
LexicalStates states = new LexicalStates();
List<Action> actions = new ArrayList<>();
final CharClasses charClasses = new CharClasses();
@Override
public UnicodeProperties getUnicodeProperties() {
return unicodeProperties;
}
@SuppressWarnings("unused")
public CharClasses getCharClasses() {
return charClasses;
}
public void setFile(File file) {
this.file = file;
}
@SuppressWarnings("unused")
Symbol symbol(int type, Object value) {
return new Symbol(type, lexLine(), lexColumn(), value);
}
@SuppressWarnings("unused")
Symbol symbol(int type) {
return new Symbol(type, lexLine(), lexColumn());
}
@SuppressWarnings("unused")
Symbol symbol_countUpdate(int type, Object value) {
int lc = lexLine();
int cc = lexColumn();
String text = lexText();
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if (c != '\n' && c != '\r' && c != ' ' && c != '\t') {
return new Symbol(type, lc, cc, value);
}
if (c == '\n') {
lc++;
cc = 0;
} else {
cc++;
}
}
return new Symbol(type, lexLine(), lexColumn(), value);
}
@SuppressWarnings("unused")
String makeMacroIdent() {
String matched = lexText().trim();
return matched.substring(1, matched.length() - 1).trim();
}
@SuppressWarnings("SameParameterValue")
public static String conc(Object a, Object b) {
if (a == null && b == null) {
return null;
}
if (a == null) {
return b.toString();
}
if (b == null) {
return a.toString();
}
return a.toString() + b.toString();
}
public static String concExc(Object a, Object b) {
if (a == null && b == null) {
return null;
}
if (a == null) {
return b.toString();
}
if (b == null) {
return a.toString();
}
return a.toString() + ", " + b.toString();
}
@SuppressWarnings({"unused", "UnusedException"})
void populateDefaultVersionUnicodeProperties() {
try {
unicodeProperties = new UnicodeProperties();
} catch (UnicodeProperties.UnsupportedUnicodeVersionException e) {
throw new ScannerException(file, ErrorMessages.UNSUPPORTED_UNICODE_VERSION, lexLine());
}
}
@SuppressWarnings("WeakerAccess")
void initUnicodeCharClasses() {
charClasses.init(unicodeProperties.getMaximumCodePoint(), this);
}
@SuppressWarnings({"unused", "UnusedException"})
void includeFile(String filePath) {
File f = new File(file.getParentFile(), filePath);
if (!f.canRead()) {
throw new ScannerException(file, ErrorMessages.NOT_READABLE, lexLine());
}
if (files.contains(f)) {
throw new ScannerException(file, ErrorMessages.FILE_CYCLE, lexLine());
}
try {
lexPushStream(f);
files.push(file);
file = f;
Out.println("Including \"" + file + "\"");
} catch (IOException e) {
throw new ScannerException(file, ErrorMessages.NOT_READABLE, lexLine());
}
}
@SuppressWarnings("unused")
File popFile() {
return files.pop();
}
public Iterable<Action> actions() {
return actions;
}
public File file() {
return file;
}
public String classCode() {
return classCode;
}
public String initCode() {
return initCode;
};
public String initThrow() {
return initThrow;
};
public String eofCode() {
return eofCode;
};
public String eofThrow() {
return eofThrow;
};
public String lexThrow() {
return lexThrow;
};
public String eofVal() {
return eofVal;
};
public String scanErrorException() {
return scanErrorException;
};
public String userCode() {
return userCode.toString();
}
public String cupSymbol() {
return cupSymbol;
};
public boolean charCount() {
return charCount;
};
public boolean lineCount() {
return lineCount;
};
public boolean columnCount() {
return columnCount;
};
public boolean cupCompatible() {
return cupCompatible;
};
public boolean cup2Compatible() {
return cup2Compatible;
};
public boolean cupDebug() {
return cupDebug;
};
public boolean isInteger() {
return isInteger;
};
public boolean isIntWrap() {
return isIntWrap;
};
public boolean isPublic() {
return isPublic;
};
public boolean isFinal() {
return isFinal;
};
public boolean isAbstract() {
return isAbstract;
};
public boolean bolUsed() {
return bolUsed;
};
public boolean standalone() {
return standalone;
};
public boolean debugOption() {
return debugOption;
};
public boolean eofclose() {
return eofclose;
};
public String isImplementing() {
return isImplementing;
};
public String isExtending() {
return isExtending;
};
public String className() {
return className;
};
public String functionName() {
return functionName;
};
public String tokenType() {
return tokenType;
};
public String visibility() {
return visibility;
};
public Set<String> stateNames() {
return states.names();
}
public int getStateNumber(String name) {
return states.getNumber(name);
}
public int ctorArgsCount() {
return ctorArgs.size();
}
public String ctorType(int i) {
return ctorTypes.get(i);
}
public String ctorArg(int i) {
return ctorArgs.get(i);
}
public int bufferSize() {
return bufferSize;
}
@Deprecated
public int currentLine() {
return lexLine();
}
@SuppressWarnings("unused")
@Deprecated
public boolean isColumnCount() {
return columnCount;
}
@SuppressWarnings("WeakerAccess")
protected abstract int lexLine();
@SuppressWarnings("WeakerAccess")
protected abstract int lexColumn();
@SuppressWarnings("WeakerAccess")
protected abstract String lexText();
@SuppressWarnings("WeakerAccess")
protected abstract void lexPushStream(File f) throws IOException;
}