1 二进制文件
解析二进制文件和解析文本文件区别在于,字符不是16位无符号数。
可以使用十六进制低位匹配,如匹配2字节的符号,可以设置高位为0。如:
1 | MARKER : '\u00CA' '\u00FE' ; |
1 | grammar IP; |
2 二进制流
词法器不关心输入的字符是字节还是Unicode字符。
以下示例写入二进制文件ips:
1 | public class WriteBinaryFile { |
创建对应8为LATIN-1表示的流:
1 | CharStream bytesAsChar = CharStreams.fromFileName("/tmp/ips", StandardCharsets.ISO_8859_1); |
解析流:
1 | //ANTLRFileStream bytesAsChar = new ANTLRFileStream("/tmp/ips", "ISO-8859-1"); DEPRECATED in 4.7 |
监听器:
1 | class MyIPListener extends IPBaseListener { |
3 自定义流
版本4.7已标记弃用ANTLRFileStream
示例:改变记号的输出文本
1 | /** make a stream treating file as full of single unsigned byte characters */ |
使用示例:
1 | ANTLRFileStream bytesAsChar = new BinaryANTLRFileStream("/tmp/ips"); |
监听器示例:
1 | class MyIPListenerCustomStream extends IPBaseListener { |
输出示例:
1 | [172(0xAC), 0(0x0), 0(0x0), 1(0x1)] |
4 二进制文件异常处理
以下示例首个IP缺少了一个0:
1 | public static final byte[] bytes = { |
输出如下:
1 | line 1:4 extraneous input '.' expecting BYTE |
其中,Êþ代表了(byte)0xCA, (byte)0xFE。