package project.scangen;
import project.nfa.NFA;
import project.scangen.nfa.NFABuilder;
import project.nfa.NFAUtil;
import project.nfa.NFAUtil.NFASegment;
import project.scangen.spec.Spec;
import project.scangen.spec.SpecReader;
import project.scangen.tokenizer.Token;
import project.scangen.tokenizer.Tokenizer;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class ScannerGenerator {
final InputStream specFileInputStream;
final InputStream programFileInputStream;
public ScannerGenerator(InputStream specFileInputStream, InputStream programFileInputStream) {
this.specFileInputStream = specFileInputStream;
this.programFileInputStream = programFileInputStream;
}
public Tokenizer generateTokenizer() {
SpecReader specReader = new SpecReader(this.specFileInputStream);
Spec spec = specReader.specify();
NFASegment nfa = NFABuilder.buildNFAFromSpec(spec);
NFA dfa = NFAUtil.convertToDFA(new NFA(nfa.start));
return new Tokenizer(dfa, programFileInputStream);
}
public static void main(String[] args) {
if (args.length != 2) {
System.err.println("Parameters: <spec-file> <program-file>");
System.exit(1);
}
String specFilePath = args[0];
String programFilePath = args[1];
ScannerGenerator scannerGenerator = null;
try {
InputStream specFileInputStream = new FileInputStream(specFilePath);
InputStream programFileInputStream = new FileInputStream(programFilePath);
scannerGenerator = new ScannerGenerator(specFileInputStream, programFileInputStream);
} catch (FileNotFoundException ex) {
System.err.println(ex);
System.exit(1);
}
Tokenizer tokenizer = scannerGenerator.generateTokenizer();
for (Token token : tokenizer) {
System.out.println(token);
}
}
}