lex 会根据你提供的 pattern 输入分解成一个个 token。pattern 是通过正则表达式去表示的。所以 我们想把 lex 学好,首先得把正则表达式学好。

正则表达式(Regular Expression)

  • .,匹配除了 \n 的任意单个字符
  • *,匹配 0 个或者多个前面的字符
  • [],表示一个字符集合。有如下规则:
    1. 匹配集合中的任意字符
    2. 如果首个字符为 ^,那么作用和 1. 相反。如 [01] 表示匹配 01。 那么 [^01] 表示匹配除 01 之外的其他字符
    3. - 去表示字符范围,如 [0-9] 等价于 [0123456789]
  • ^,表示一行的开头字符
  • $,表示匹配一行的最后一个字符
  • {},表示前面的 pattern 匹配多少次,如 A{3} 表示等价于 AAA
  • \,用于去 escape metacharacters,如 \* 就表示匹配字面意义上的 *
  • +,表示匹配一个或者多个前面的 regular expression。如 [0-9]+ 就可以匹配 111343等等
  • ?,表示匹配一个或者 0 个前面的 regular expression,如 -?[0-9]+ 可以匹配正数,负数及 0
  • |,表示匹配前面的 regular expression 或者后面的 regular expression,如 cow|pig 可以匹配 cow 或者 pig
  • "...",表示将双引号内部的所有字符(除了 c escape sequences) literally,如 "abc[d]+" 匹配的就是 abc[d]+