4

我正在使用 JavaCC 创建语法并且遇到了一个小问题。我试图允许生成的编译器识别 ASCII 扩展集中的任何有效字符。在查看了相同的 JavaCC 示例(主要是显示 JavaCC Grammer 本身的示例)之后,我设置了以下标记来识别我的字符:

< CHARACTER:

  (   (~["'"," ","\\","\n","\r"])
    | ("\\"
        ( ["n","t","b","r","f","\\","'","\""]
        | ["0"-"7"] ( ["0"-"7"] )?
        | ["0"-"3"] ["0"-"7"] ["0"-"7"]
        )
      )
  )

>

如果我正确理解这一点,它应该匹配所有 ASCII 字符的八进制表示,从 0-377(涵盖扩展 ASCII 集中的所有 256 个字符)。这对所有键盘字符(az、0-9、?、./ 等)甚至大多数特殊字符(©、¬®)都按预期执行。但是,每当我尝试解析“商标”符号 (™) 时,我的解析器都会不断抛出 End of File 异常,表明它无法识别该符号。是否有一些明显的方法可以增强我对字符的定义以允许商标符号被接受?

4

2 回答 2

2

我在识别文本文件的特殊符号(CP1252 或 ISO-8859-1 编码)时遇到了类似的问题,该文件在解析之前被读取到字符串中。我的解决方案是添加UNICODE_INPUT到语法标题:

options {
  UNICODE_INPUT=true;
}

工作就像微风一样。

有关 JavaCC 选项的更多信息:http: //javacc.java.net/doc/javaccgrm.html

于 2011-12-07T14:10:19.253 回答
1

事实证明,我希望我的语法接受所有有效的 Unicode 字符而不是 ASCII 字符,™ 符号是 Unicode 规范的一部分,而不是 ASCII 扩展字符集中的一部分。如下所述将我的令牌更改为有效字符解决了我的问题:(有效的 unicode 格式为 - U+00FF)

< CHARACTER:(   (~["'"," ","\\","\n","\r"])
| ("\\"
    ( ["n","t","b","r","f","\\","'","\""]
    | ["u","U"]["+"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]
    )
  ) )>
于 2009-04-20T17:06:19.220 回答