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编码测试的一样