JFlex字符串正则表达式奇怪的行为



我正在尝试在JFlex中编写JSON字符串解析器,到目前为止,我有

string = "((\("|\|/|b|f|n|r|t|u[0-9a-fA-F]{4})) | [^"\])*"

,我认为捕获规格(http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf)。我对控制字符和标准字符和符号进行了测试,但由于某种原因,它不接受£或(或)或¬。请问有人能让我知道是什么导致这种行为?

也许您正在JLex兼容模式下运行?如果是这样,请参阅官方JFlex用户手册中的以下内容。默认情况下,它将使用7位字符代码作为输入,而您想要的是16位(unicode)。

您可以通过在第一个%%之后添加%unicode行来解决这个问题。

输入字符集

%7bit

使生成的扫描器使用7位输入字符集(字符码0-127)。如果在运行时输入中遇到代码大于127的输入字符,扫描器将抛出ArrayIndexOutofBoundsException异常。不仅因为这个,你应该考虑使用%unicode指令。有关字符编码的信息,请参见编码。这是JLex兼容模式下的默认设置。

%full
%8bit

两个选项都会导致生成的扫描器使用8位输入字符集(字符码0-255)。如果在运行时输入中遇到代码大于255的输入字符,扫描器将抛出ArrayIndexOutofBoundsException异常。请注意,即使您的平台每个字符只使用一个字节,字符的Unicode值仍然可能大于255。如果你正在扫描文本文件,你应该考虑使用%unicode指令。有关字符编码的更多信息,请参见条件一节。

%unicode
%16bit

两个选项都会导致生成的扫描器使用完整的Unicode输入字符集,包括补充代码点:0-0x10FFFF。%unicode并不意味着扫描器一次将读取两个字节。读取的内容和字符的构成取决于运行时平台。有关字符编码的更多信息,请参见编码部分。这是默认值,除非使用JLex兼容模式(命令行选项--jlex)。

相关内容

  • 没有找到相关文章

最新更新