четверг, 24 ноября 2011 г.

ANTLR и java.lang.OutOfMemoryError

Если при разработке парсера с помощью ANTLR у вас появилась ошибка java.lang.OutOfMemoryError, то проверьте, нет ли у вас "пустых" правил. То есть таких правил, которые порождают пустые строки. Например, можно сделать ошибку в часто встречаемом правиле для пробелов и табуляций:

WS: (' ' | '\t')*        { $channel = HIDDEN; };

Здесь, вместо + написан символ *, что заставляет ANTLR создавать бесконечное число токенов WS. Трассировка вызовов обычно выглядит так:

java -cp /usr/local/bin/antlrworks-1.4.3.jar:. TooDeep test.txt
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at org.antlr.runtime.Lexer.emit(Lexer.java:160)
        at org.antlr.runtime.Lexer.nextToken(Lexer.java:91)
        at org.antlr.runtime.BufferedTokenStream.fetch(BufferedTokenStream.java:133)
        at org.antlr.runtime.BufferedTokenStream.sync(BufferedTokenStream.java:127)
        at org.antlr.runtime.CommonTokenStream.consume(CommonTokenStream.java:70)
        at org.antlr.runtime.BaseRecognizer.match(BaseRecognizer.java:106)
        at TooDeepParser.prog(TooDeepParser.java:47)
        at TooDeep.main(TooDeep.java:15)

Конечно, такая ошибка может возникнуть и при использовании ANTLR вместе с другими языками, не только с Java.

Комментариев нет:

Отправить комментарий