Работа с ANTLR4

241
15 июля 2017, 07:16

Не пойму почему конец файла не определяется?

Задание такое:

Необходимо разработать приложение - парсинг логов веб-сервера. Необходимо использовать Java SE(любую версию) и ANTLR v4.

Лог имеет вид:

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326

127.0.0.1 - это адрес клиента GET - метод запроса 200 - код возврата Подробнее - https://httpd.apache.org/docs/2.4/logs.html#accesslog

Во время парсинга для каждой записи следует задавать отдельный java-объект, у которого дата представлена в виде java.util.Date, тип запроса - enum, код возврата - int, IP - java.lang.String.

На выходе требуется вывести топ-10 самых активных IP-адресов с указанием количества обращений, которые получали код возврата 500.
Файл грамматики:

  grammar LogRead;
  proc: IP Whitespace unaryOperator Whitespace USER Whitespace LSQUARE date RSQUARE Whitespace  STRING Whitespace IP Whitespace IP (Whitespace | EOF)
    ;
  date: DATE Whitespace DATE
     ;
IP: [0-9.]+;
USER: [a-zA-Z]+;
DATE: [a-zA-Z:0-9/-]+;
STRING
:  '"' ( Enum | ~('\\'|'"') )* '"'
;
Enum : 'GET' | 'POST';
unaryOperator
:   '&' | '*' | '+' | '-' | '~' | '!'
;
LSQUARE : '[' ;
RSQUARE : ']' ;
Whitespace : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ /*-> skip */;

Файл парсера:

public class ParserNew {
private Map<String, Integer> hasMap = new HashMap<>();
public void parseMethod(String string) throws IOException {
    try {
    LogReadLexer lexer = new LogReadLexer(new ANTLRFileStream(string));
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    LogReadParser parser = new LogReadParser(tokens);
    while (true) {
        ParseTree tree = parser.proc();
        if (Integer.parseInt(String.valueOf(tree.getChild(12))) == 500) {
            String temp = String.valueOf(tree.getChild(0));
            if (hasMap.containsKey(String.valueOf(tree.getChild(0)))) {
                hasMap.put(temp, hasMap.get(temp) + 1);
                  } else hasMap.put(temp, 1);
             }
         }
    }
    catch (NumberFormatException e) {
            System.out.println("Лог закончился");
        }
    catch (FileNotFoundException e) {
        System.out.println("Файл не найден");
    }
        parseSort(hasMap);
    }

public void parseSort(Map<String, Integer> hashMap) {
    Map<String, Integer> result = new LinkedHashMap<>();
    hashMap.entrySet().stream()
            .sorted(Map.Entry.<String, Integer>comparingByValue().reversed()).limit(2)
            .forEach(s->System.out.println(s.getKey() +  s.getValue()));
            }
    }
READ ALSO
Какие есть open-source GUI проекты на JavaFX/Swing? [требует правки]

Какие есть open-source GUI проекты на JavaFX/Swing? [требует правки]

Начал изучать JavaFX, и писать некоторые маленькие GUI приложенияВроде все хорошо, но когда перехожу на что-то сложное в коде всегда какой-то бардак...

248
Жизненный цикл android приложения

Жизненный цикл android приложения

Для реализации задачи, мне необходим Service который запускается при старте приложения и останавливается при закрытии

273
Выбор ТОЛЬКО папок в JFileChooser

Выбор ТОЛЬКО папок в JFileChooser

Пытался запретить выбор файлов (можно выбирать только файлы) путем функции JFileChooserDIRECTORIES_ONLY:

241
Android 6.0+ не сохраняет изображения

Android 6.0+ не сохраняет изображения

Проблема такая, на версиях андройд меньше 60 все отлично работает, но на 6

366