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 ;

Полный пример кода здесь

Другие вопросы по тегам