Генерируемый Antlr лексер зависает на юникодном символе дополнительной плоскости (antlr 3.4)

Я разбираю PHP-код, используя antlr Grammar и antlr Ruby Target. Один из исходных файлов, который мне нужно разобрать, на самом деле содержит перевод, некоторые из них активно используют символы Unicode. Грамматика, кажется, зависит от одного символа из «дополнительной плоскости», а именно U +10430.

У меня была похожая проблема в прошлом из-за того, что цель Ruby antlr довольно старая и не совместима с юникодом (ну, в то время Ruby не был). Нам пришлось увеличить RubyTarget.java getMaxCharValue с 0xFF (ascii) до 0xFFFF (юникод), чтобы решить эту проблему. Сейчас кажется, что и этого набора недостаточно. Unicode утверждает, что символы за пределами этого диапазона могут быть представлены двумя символами UTF-16, но как antlr справляется с этим? Поможет ли повторное изменение getMaxCharValue (один раз это помогло, но я не сторонник подхода «попробовать»)?

Спасибо !


person Martin    schedule 26.12.2012    source источник


Ответы (1)


Эталонная цель Java для ANTLR может анализировать символы только в дополнительной плоскости, используя суррогатную пару UTF-16 в грамматике и используя кодировку UTF-16 для вашего входного потока. Другие цели создаются членами сообщества и могут поддерживать или (как вы видели цель Ruby) не поддерживать тот же диапазон символов.

Поскольку в самой грамматике невозможно представить что-либо после 0xFFFE, вы будете ограничены кодировкой UTF-16, даже если вы измените цель для поддержки символов выше 0xFF.

person Sam Harwell    schedule 26.12.2012
comment
Спасибо уже за информативный ответ. Мне не нужно представлять их как таковые (эти символы находятся внутри строки в кавычках и не представляют для меня реального интереса), просто чтобы заставить лексер принять их как действительное содержимое QuotedString в этом случае. У вас есть пример грамматики, использующей суррогатную пару UTF-16? - person Martin; 26.12.2012
comment
Хорошо, также нашел это: antlr.org/pipermail/antlr- интерес/2009-August/035780.html, который должен помочь людям в этой ситуации. - person Martin; 27.12.2012