2016-01-28 1 views
2

У меня есть эта грамматика:ANTLR 4 изо-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)={ 

EDIT: Я использую ANTLR 4.5.1 (и протестировали 4.4 - такой же вопрос).

+0

Предоставляет ли ANTLRFileStream поток * символов Unicode * в lexer? [Тогда \ u0161 был бы прав] Или это кодирование просто способ сказать ему читать 8-битные байты, не интерпретируя их? [Тогда \ u00a8 будет правильным кодом для «š».] –

+0

Я тестировал с \ u00a8 вместо \ u0161. Такая же ошибка. – simsulla

+0

Корректировка самого себя: Использование \ u00a8 действительно работает.Ира Бакстер кажется, что вы правы. Кодирование всего лишь способ сообщить ему читать 8-битные байты. – simsulla

ответ

0

Я думаю, проблема может быть в том, как вы используете для генерации парсера. Я не уверен, что именно может пойти не так, но мне удалось сделать рабочий пример с вашим символом, который использует 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 ; 

Полный пример кода here

+0

Также убедитесь, что ваш файл на самом деле находится в 'ISO-8859-15', некоторые редакторы могут автоматически сохранять в« UTF-8 ». Чтобы проверить это, попробуйте использовать 'UTF-8' для чтения файла. –

+0

Это ANSI закодирован (ISO-8859-15) в блокноте ++ Милешовка Если я установить его в UTF-8 Mile ۯ ВКА EDIT: š является X9A – simsulla

+0

Так с Maven сборки, что делает вашу грамматику, взгляд .g4 файл как? – simsulla

0

Ira Baxter Комментарий ответит вопрос:

Предоставляет ли ANTLRFileStream поток символов Unicode для лексера? [Тогда \ u0161 был бы прав] Или это кодирование просто способ сказать ему читать 8-битные байты, не интерпретируя их? [Тогда \ u00a8 будет правильным кодом для «š».]