Простой лексический анализ Java-программы - PullRequest
4 голосов
/ 17 января 2012

Мой маленький проект - программа лексического анализа, в которой я должен взять каждое слово, найденное в произвольном файле .java, и перечислить каждую строку, в которой оно появляется в файле.Мне нужно, чтобы одна справочная таблица была посвящена только зарезервированным словам, а другая - всем дополнительным словам, найденным в документе.Так для такой программы, как:

    public class xxxx {
    int xyz;
    xyz = 0;
}

Вывод должен быть:

Reserved words:
class: 1
int: 2
public: 1

Other words:
xxxx: 1
xyz: 2, 3

Но есть много проблем с моей текущей программой, и поэтому я понятия не имею, что происходит,так что поправки к моей программе или полная перезапись приветствуются.Я просто пытаюсь овладеть языком Java как хобби, поэтому всякая помощь приветствуется, пока я могу понять, что происходит.Я уверен, что есть простое решение этой проблемы, но моя попытка не сработала :( Спасибо за любую помощь ^^

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");
    }


}

Ответы [ 2 ]

1 голос
/ 18 января 2012

Самый простой способ сделать это - использовать JFlex с правильным файлом lex, определяющим ключевые слова. Если у вас есть это, подсчет идентификаторов и ключевых слов становится тривиальным.

0 голосов
/ 15 января 2015

Я нашел одну ошибку, которая, я думаю, исправила все.Вам необходимо указать каталог файла, который вы восстанавливаете в своей главной.Например, теперь у вас есть новый LexicalAnalysis ("lexitest.txt");

В моем примере я использую флэш-накопитель, поэтому это будет новый LexicalAnalysis ("F" \ lexitest.txt ");

...