From 《Compiler Construction Using Java ,JavaCC ,Yacc》
在JavaCC使用的扩展正规表达式中,字母表中的符号或这些符号的串括在双引号中。如表示 “b”或者“c”的表达式是
"b"|"c"
其中竖线表示联合操作
而
"b|c"
只表示一个串”b|c”,因为竖线被包含在引号中,不属于联合操作。
在javacc扩展正规表达式中,可以使用 *、+ 和 ?操作符,javacc在使这些操作的时候应该使用括号括起操作对象。如 表示0个或者对个b的串时:
("b")*
而不是
"b"*
使用[ ]号可以描述单个字符集合,例如描述包括 “b”,“c”“d”的集合时可以用
["b","c","d"]
也可以用
"b"|"c"|"d"
用方括号的优点可以通过横线来描述符号的范围,例如为了描述英文中所有的大写或者小写字母,可以这样表示
["A"-"Z","a"-"z"]
而列出所有52个字母显得臃肿,特别注意的是在方括号中描述的仅限于单个字符的集合,不能用来表示字符序列。例如
["b","cd","\n"] <------- 在方括号中"cd"是不合法的
“b”和”\n”是合法的,因为”\n”表示换行符,是一个字符。”cd”是字符序列。
取补操作 ~ 仅可作用于方括号定义的集合。
~["b"]
而下列不合法
~"b"
与 *,+和?操作符不同,括号将不能用于~操作。下列的表达式不合法
~(["b"])
~("b")
可能你会想到[]表示空集 则~[]表示字母表全集。
字符串全集则为
(~[])*
在javacc扩展正规表达式中双引号之间的任何空格都可以忽略
"b"|"c" equals to "b" | "c" !equals to "b "|"c"
原因显而易见,b后面跟着空白符号。
定义无符号整数单词符号类,一个无符号整数由一个或者多个数字组成
(["0"-"9"])+
然而想表示无符号整数已经带小数点的数。如
32 3.20 45. .11
应该用
(["0"-"9"])+ |
(["0"-"9"])*"."(["0"-"9"])+ |
(["0"-"9"])+"."
在字符串中双引号和反斜线是特殊字符,因此如果要描述普通的双引号和反斜线,必须再加一个反斜线。例如表示一个由“A”,反斜线,双引号,“B”的字符串。
"A"\\\""B"
"A\nB" 匹配的是A ,换行,B
"A\\nB" 匹配的是A ,\,n,B
JavaCC允许正规表达式关联一个名字,为了做到这一点,需要将名字和正规表达式用<>放在一起,两者用:隔开。关联无符号整数和表达式如下
<UNSIGNED:(["0"-"9"])+>
习惯上,名字都用大写字母,一旦起了名字,就可以用这个名字引用它所描述的单词符号类。如下列的文法:
void factor:{Token t;}
{
t=<UNSIGNED>
{
cg.emit("unsigned"+t.image);
}
|
t=<ID>
{
cg.emit("id"+t.image);
}
}
对应的正规表达式为:
<UNSIGNED:(["0"-"9"])+>
<ID:["A"-"Z","a"-"z"](["A"-"Z","a"-"z","0"-"9"])*>
如果一个正规表达式给定了一个名字,则另一个正规表达式可以使用这些名字,需要用<>。
<DIGIT:["0"-"9"]>
//then
<UNSIGNED:(<DIGIT>)+>