Simple lexical analysis Java program
My small project is a lexical analysis program. I have to work at any time Find each word in the java file and list every line it appears in the file I need a lookup table dedicated to reserved words and another table for all additional words found in the document So for programs like this:
public class xxxx {
int xyz;
xyz = 0;
}
The output should be:
Reserved words: class: 1 int: 2 public: 1 Other words: xxxx: 1 xyz: 2,3
But my current program has many problems, so I don't know what will happen recently, so my program modification or complete rewriting is welcome I'm just trying to make the Java language a hobby, so as long as I can understand what it is, all help is welcome I'm sure there is a simple solution to this problem, but my attempt is useless: (thank you for your help^^
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class LexicalAnalysis {
private String[] keywords = { "abstract","boolean","byte","case","catch","char","class","continue","default","do","double","else","extends","final","finally","float","for","if","implements","import","instanceof","int","interface","long","native","new","package","private","protected","public","return","short","static","super","switch","synchronized","this","throw","throws","transient","try","void","volatile","while","false","true","null" };
HashMap<String,ArrayList<Integer>> keywordsTable;
HashMap<String,ArrayList<Integer>> otherWords = new HashMap<String,ArrayList<Integer>>();
public LexicalAnalysis(String fileName){
Scanner kb = null;
int lineNumber = 0;
try {
kb = new Scanner(new File(fileName));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
keywordsTable = new HashMap<String,ArrayList<Integer>>();
for(int i = 0; i < 47; i++){
keywordsTable.put(keywords[i],new ArrayList<Integer>());
}
while(kb.hasNextLine()){
lineNumber++;
String line = kb.nextLine();
String[] lineparts = line.split("\\s+|\\.+|\\;+|\\(+|\\)+|\\\"+|\\:+|\\[+|\\]+");
for(String x: lineparts){
ArrayList<Integer> list = keywordsTable.get(x);
if(list == null){
list = otherWords.get(x);
if(list == null){
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(lineNumber);
otherWords.put(x,temp);
}else{
otherWords.remove(x);
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(lineNumber);
otherWords.put(x,temp);
}
}else{
keywordsTable.remove(x);
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(lineNumber);
keywordsTable.put(x,temp);
}
}
}
System.out.println("Keywords:");
printMap(keywordsTable);
System.out.println();
System.out.println("Other Words:");
printMap(otherWords);
}
public static void printMap(Map<String,ArrayList<Integer>> mp) {
Iterator<Map.Entry<String,ArrayList<Integer>>> it = mp.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String,ArrayList<Integer>> pairs = (Map.Entry<String,ArrayList<Integer>>)it.next();
System.out.print(pairs.getKey() + " = ");
printList(pairs.getValue());
System.out.println();
it.remove();
}
}
public static void printList(List x){
for(Object m : x){
System.out.print(m + ",");
}
}
public static void main(String args[]){
new LexicalAnalysis("lexitest.txt");
}
}
Solution
The easiest way is to use jflex and the correct Lex file to define keywords Once you have it, calculating identifiers and keywords is trivial
