antlr 4 iso-8859-15 кодированный файл, соответствующий строке, содержащей \u0161 š
У меня есть эта грамматика:
KEY
: [a-zA-Z\u0160\u0161\u00C0-\u00FF][a-zA-Z_0-9\-\''\u0160\u0161\u00C0-\u00FF]*
;
Чтение текстового файла в кодировке ISO-8859-15
new ANTLRFileStream(fileName, "ISO-8859-15")
со строкой Milešovka
, Почему š
выдает ошибку распознавания токена?
Трассировка:
line 110:6 token recognition error at: ''exit field, LT(1)={
РЕДАКТИРОВАТЬ: я использую antlr 4.5.1 (и проверил 4.4 - та же проблема).
2 ответа
Комментарий Айры Бакстер отвечает на вопрос:
Всегда ли ANTLRFileStream предоставляет лексеру поток символов Unicode? [Тогда \u0161 был бы прав] Или это кодирование просто способ сказать ему читать 8-битные байты, не интерпретируя их? [Тогда \u00a8 будет правильным кодом для "š".]
Я думаю, что проблема может быть в том, как вы используете для генерации парсера. Я не уверен, что именно может пойти не так, но мне удалось сделать рабочий пример с вашим символом, который использует maven для генерации грамматики.
pom.xml
<build>
<plugins>
<plugin>
<groupId>org.antlr</groupId>
<artifactId>antlr4-maven-plugin</artifactId>
<version>4.5</version>
<configuration>
<outputDirectory>src/main/java</outputDirectory>
<listener>false</listener>
<visitor>true</visitor>
</configuration>
<executions>
<execution>
<goals>
<goal>antlr4</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
<version>4.5.1</version>
</dependency>
</dependencies>
LexerGrammar.g
lexer grammar TestLexer;
LBR: '[';
RBR: ']';
KEY
: [a-zA-Z\u0160\u0161\u00C0-\u00FF][a-zA-Z_0-9\-\''\u0160\u0161\u00C0-\u00FF]*
;
ParserGrammar.g
parser grammar TestParser;
options { tokenVocab=TestLexer; }
rul : block+ ;
block : LBR KEY RBR ;
Полный пример кода здесь