package jplag.text;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import jplag.InputState;
import jplag.ParserToken;
import jplag.Structure;
/**
* @Changed by Emeric Kwemou 29.01.2005
*
*/
public class Parser extends jplag.Parser implements jplag.TokenConstants {
protected TokenStructure tokenStructure = new TokenStructure();
private Structure struct;
private String currentFile;
private HashSet<String> filter = null;
public void initializeFilter(String fileName) throws FileNotFoundException {
File file = new File(fileName);
filter = new HashSet<String>();
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
while ((line = reader.readLine()) != null) {
line.trim();
filter.add(line.toLowerCase());
}
System.out.println("Filter: " + filter.size() + " words read.");
reader.close();
} catch (Exception e) {
System.out.println("Error reading filter file!");
System.out.println(e);
if (e instanceof FileNotFoundException)
throw (FileNotFoundException) e;
}
}
public jplag.Structure parse(File dir, String files[]) {
struct = new Structure();
errors = 0;
for (int i = 0; i < files.length; i++) {
getProgram().print("", "Parsing file " + files[i] + "\n");
if (!parseFile(dir, files[i]))
errors++;
struct.addToken(new TextToken(FILE_END, files[i], this));
}
Structure tmp = struct;
struct = null;
this.parseEnd();
return tmp;
}
public boolean parseFile(File dir, String file) {
InputState inputState = null;
try {
FileInputStream fis = new FileInputStream(new File(dir, file));
currentFile = file;
// Create a scanner that reads from the input stream passed to us
inputState = new InputState(fis);
TextLexer lexer = new TextLexer(inputState);
lexer.setFilename(file);
lexer.setTokenObjectClass("jplag.ParserToken");
// Create a parser that reads from the scanner
TextParser parser = new TextParser(lexer);
parser.setFilename(file);
parser.parser = this;// Added by Emeric 26.01.05 BAD
// start parsing at the compilationUnit rule
parser.file();
// close file
fis.close();
} catch (Exception e) {
getProgram().addError(" Parsing Error in '" + file +
"' (line " + (inputState != null ? "" + inputState.getLine()
: "") + "):\n " + e.getMessage());
return false;
}
return true;
}
public void add(antlr.Token tok) {
ParserToken ptok = (ParserToken) tok;
if (filter != null && filter.contains(tok.getText().toLowerCase()))
return;
struct.addToken(new TextToken(tok.getText(), currentFile, ptok
.getLine(), ptok.getColumn(), ptok.getLength(), this));
}
private boolean runOut = false;
public void outOfSerials() {
if (runOut)
return;
runOut = true;
errors++;
program.print("ERROR: Out of serials!", null);
System.out.println("jplag.text.Parser: ERROR: Out of serials!");
}
public static void main(String args[]) {
if (args.length != 1) {
System.out.println("Only one parameter allowed.");
System.exit(-1);
}
Parser parser = new Parser();
jplag.Structure struct = parser.parse(new File("."), args);
try {
BufferedReader reader = new BufferedReader(new FileReader(new File(args[0])));
int lineNr = 1;
int token = 0;
String line;
while ((line = reader.readLine()) != null) {
if (token < struct.size()) {
boolean first = true;
while (struct.tokens[token] != null && struct.tokens[token].getLine() == lineNr) {
if (!first)
System.out.println();
jplag.Token tok = struct.tokens[token];
System.out.print(TextToken.type2string(tok.type) + " (" + tok.getLine() + "," + tok.getColumn() + ","
+ tok.getLength() + ")\t");
first = false;
token++;
}
if (first)
System.out.print(" \t");
} else
System.out.print(" \t");
System.out.println(line);
lineNr++;
}
reader.close();
} catch (IOException e) {
System.out.println(e);
}
}
}