我正在使用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个字符)。这对所有键盘字符(a-z,0-9,?,。/ etc)以及大多数特殊字符(©,¬®)都有预期效果。 但是,每当我尝试解析'trademark'符号(™)时,我的解析器会不断抛出End of File异常,表示它无法识别该符号。是否有一些明显的方法可以增强我对字符的定义以允许商标符号被接受?
答案 0 :(得分: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"]
)
) )>
答案 1 :(得分:0)
我有类似的问题,用于识别文本文件(CP1252或ISO-8859-1编码)的特殊符号,在解析之前将其读取到字符串。我的解决方案是将UNICODE_INPUT
添加到语法标题中:
options {
UNICODE_INPUT=true;
}
轻而易举地工作。
有关JavaCC选项的更多信息:http://javacc.java.net/doc/javaccgrm.html