Для обычных тегов XML (например, и ) выходные данные корректны: пробелы и разрывы строк сохраняются.
Однако для добавленного мной специального правила синтаксического анализатора DOCTYPE выходные данные теряет все пробелы, даже если исходный XML содержит пробелы и разрывы строк.
Ожидаемое поведение:
Я хочу, чтобы выходные данные DOCTYPE сохраняли исходное форматирование, включая пробелы и разрывы строк, например:
Код: Выделить всё
]>
Вывод, создаваемый TokenStreamRewriter.getText(), выглядит следующим образом:
Код: Выделить всё
]>
Используются правила синтаксического анализатора:
Код: Выделить всё
dtd :
DOCTYPE_OPEN Name LBRACK misc* entityDecl* RBRACK CLOSE misc* entityRef?
;
entityDecl
: ENTITY_OPEN Name STRING misc* CLOSE
;
entityRef
: '' EntityRef ''
;
Я подозреваю, что эта проблема связана с уровнем лексера. TokenStreamRewriter.getText() просто объединяет token.text, поэтому, если лексер пропускает пробельные токены, они не отображаются в выводе.
Я хочу знать:
- Как я могу изменить правила лексера/парсера ANTLR4, чтобы в выводе DOCTYPE сохранялись пробелы?
- Существует ли рекомендуемый подход, гарантирующий, что TokenStreamRewriter.getText() выводит текст, который почти идентичен исходному XML?
- Добавление пробелов в посетителе вручную работает, но это громоздко.
- Использование rewriter.getText(ctx.start, ctx.stop) не помогает, если пропускаются токены пробелов.
Мобильная версия