我正在尝试在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)。 我已经在控制字符和标准字符和符号上测试了它,但由于某种原因它不接受£或(或)或¬。请有人能告诉我造成这种行为的原因吗?
答案 0 :(得分:4)
也许你在JLex兼容模式下运行?如果是这样,请参阅官方JFlex用户手册中的以下内容。它似乎默认使用7位字符代码输入,而你想要的是16位(unicode)。
您可以通过在第一个%unicode
之后添加第%%
行来解决此问题。
输入字符集
%7bit
使生成的扫描仪使用7位输入字符集(字符代码0-127)。如果在运行时输入中遇到代码大于127的输入字符,则扫描程序将抛出ArrayIndexOutofBoundsException。不仅因为这个原因,您还应该考虑使用%unicode指令。有关字符编码的信息,另请参阅编码。这是JLex兼容模式的默认设置。
%full
%8bit
这两个选项都会使生成的扫描仪使用8位输入字符集(字符代码0-255)。如果在运行时输入中遇到代码大于255的输入字符,则扫描程序将抛出ArrayIndexOutofBoundsException。请注意,即使您的平台每个字符只使用一个字节,字符的Unicode值仍可能大于255.如果您正在扫描文本文件,则应考虑使用%unicode
指令。有关字符编码的更多信息,另请参阅Econdings部分。
%unicode
%16bit
这两个选项都会导致生成的扫描程序使用完整的Unicode输入字符集,包括补充代码点:0-0x10FFFF。 %unicode
并不意味着扫描程序一次读取两个字节。读取内容和构成角色的内容取决于运行时平台。有关字符编码的更多信息,另请参见编码部分。除非使用JLex兼容模式(命令行选项--jlex
),否则这是默认值。