2015-10-02 3 views
5

Я пытаюсь использовать ANTLR V4 с публично данной Java 8 грамматики - https://github.com/antlr/grammars-v4/blob/master/java8/Java8.g4ANTLR V4 + Java8 Грамматика -> OutOfMemoryException

Я создал файлы классов и попытался разобрать Java 8 JRE, но почему-то на java.text.SimpleDateFormat.java он падает с :

java.lang.OutOfMemoryError: GC overhead limit exceeded 

Он также аварии, когда я пытаюсь разобрать, что один файл в одиночку.

Можно ли это как-то решить? Очевидно, ANTLR V4 не может обрабатывать файлы с более чем 2000 LOC? Это правильное предположение?

Что я сделал до сих пор:

  • Изменение назначенных памятей JVM в нескольких шагах от 256 до 4 Гб - это то изменение в

    java.lang.OutOfMemoryError: Java пустое место

  • Для обеспечения отсутствия синтаксической проблемы с входным файлом
    Сначала я снял первую половину файла ->разбора кажется, хорошо,
    затем расстегнул, что действие и удалили вторую половину файла ->разбора кажется, хорошо

+3

... и вы увеличили размер памяти java, например используя '-Xmx'? – Petesh

+0

Привет, Петеш! Я сделал это раньше - я обновил свой вопрос ... Thx! –

+0

Комментировать последовательно, чтобы найти проблемный код. –

ответ

8

Похоже грамматика в том репозитории основана на том, что я написал. Грамматика основана на определенных функциях, которые доступны только в моем "optimized" fork of ANTLR 4, чтобы хорошо работать. В дополнение к использованию этого релиза, вам необходимо сделать следующие две вещи, чтобы максимально увеличить производительность:

  1. Используйте стратегию синтаксического анализа два этапа. Если предположить, что правило запуска называется compilationUnit, это может выглядеть следующим образом:

    CompilationUnitContext compilationUnit; 
    try { 
        // Stage 1: High-speed parsing for correct documents 
    
        parser.setErrorHandler(new BailErrorStrategy()); 
        parser.getInterpreter().setPredictionMode(PredictionMode.SLL); 
        parser.getInterpreter().tail_call_preserves_sll = false; 
        compilationUnit = parser.compilationUnit(); 
    } catch (ParseCancellationException e) { 
        // Stage 2: High-accuracy fallback parsing for complex and/or erroneous documents 
    
        // TODO: reset your input stream 
        parser.setErrorHandler(new DefaultErrorStrategy()); 
        parser.getInterpreter().setPredictionMode(PredictionMode.LL); 
        parser.getInterpreter().tail_call_preserves_sll = false; 
        parser.getInterpreter().enable_global_context_dfa = true; 
        compilationUnit = parser.compilationUnit(); 
    } 
    
  2. Включить глобальный контекст DFA (я включил это в предыдущем блоке кода, так что вы не можете пропустить это)

    parser.getInterpreter().enable_global_context_dfa = true; 
    
+0

Привет, Сэм! Спасибо за ваш ответ - он полностью попал в гвоздь :) –

+0

Привет @SamHarwell, у меня также есть файл, который вызывает спасение GC-памяти выше. Есть ли вероятность, что функциональность этого исправления превратит его в основной дистрибутив antlr? Или вы будете распространять .jar для своей вилки? (Так как я не являюсь уроженцем java-мира. У меня нет инструментов для построения вилки.) – t0rst

+0

@ user138304 - это «оптимизированная» вилка, интегрированная в ANTLR 4.6? – t0rst

 Смежные вопросы

  • Нет связанных вопросов^_^