JavaCC中扩展的正规表达式

来源:互联网 发布:caffe训练googlenet 编辑:程序博客网 时间:2024/05/21 21:17

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>)+>

1 0