Encoding antlr 4 iso-8859-15编码文件匹配字符串,包含\u0161š;

Encoding antlr 4 iso-8859-15编码文件匹配字符串,包含\u0161š;,encoding,antlr,antlr4,ansi,iso-8859-15,Encoding,Antlr,Antlr4,Ansi,Iso 8859 15,我有这样的语法: 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

我有这样的语法:

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-相同的问题)。

我认为问题可能在于您用于生成解析器的方式。我不确定到底会出什么问题,但我成功地用您的符号做了一个工作示例,它使用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>
ParserGrammar.g

lexer grammar TestLexer;

LBR: '[';
RBR: ']';
KEY
: [a-zA-Z\u0160\u0161\u00C0-\u00FF][a-zA-Z_0-9\-\''\u0160\u0161\u00C0-\u00FF]*
;
parser grammar TestParser;

options { tokenVocab=TestLexer; }

rul   : block+ ;
block  : LBR KEY RBR ;

完整的示例代码是

Ira Baxter的评论回答了以下问题:


ANTLRFileStream是否总是向lexer提供Unicode字符流?[那么\u0161是正确的]或者这种编码只是告诉它读取8位字节的一种方式,而不解释它们吗?[那么\u00a8将是“š”的正确代码。]


ANTLRFileStream是否总是向lexer提供Unicode字符流?[那么\u0161是正确的]或者这种编码只是告诉它读取8位字节的一种方式,而不解释它们吗?[那么\u00a8将是“š”的正确代码]。我使用\u00a8而不是\u0161进行了测试。同样的错误。纠正我自己:使用\u00a8确实有效。你的Ira Baxter似乎是正确的。编码只是告诉它读取8位字节的一种方式。ANTLRFileStream方案看起来非常愚蠢。如果ANTLR要处理“16位”代码,为什么它不总是使用Unicode字符集运行?这意味着你的lexer依赖于你的文件编码,它会根据地区甚至风向而改变。[我猜你的问题是基于15年前我们的解析工具的类似愚蠢,这让我们正确地解决了编码问题]。此外,确保你的文件实际位于
ISO-8859-15
,一些编辑器可能会自动保存在“UTF-8”中。要测试这一点,请尝试实际使用
UTF-8
读取文件。如果我将其设置为UTF-8 Mileۯvka EDIT:š是x9ASo,那么在maven构建中,您的语法是什么,.g4文件看起来像?更正我以前的注释:如果在记事本++:Milešovka中设置为ISO-8859-15如果我将其设置为UTF-8:Mileۯvka(即x00a8)更正我以前的注释。。。。正如我用ANSI编码测试的一样