2

我有这个语法:

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

4

2 回答 2

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>

词法语法.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 ;

完整的示例代码在这里

于 2016-01-28T10:48:43.120 回答
0

Ira Baxter 的评论回答了这个问题:

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

于 2016-01-28T11:36:26.060 回答