Если при разработке парсера с помощью 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.
Комментариев нет:
Отправить комментарий