Learn Lex
lex 会根据你提供的 pattern 输入分解成一个个 token。pattern 是通过正则表达式去表示的。所以 我们想把 lex 学好,首先得把正则表达式学好。
正则表达式(Regular Expression)
.,匹配除了\n的任意单个字符*,匹配 0 个或者多个前面的字符[],表示一个字符集合。有如下规则:- 匹配集合中的任意字符
- 如果首个字符为
^,那么作用和1.相反。如[01]表示匹配0或1。 那么[^01]表示匹配除0或1之外的其他字符 - 用
-去表示字符范围,如[0-9]等价于[0123456789]
^,表示一行的开头字符$,表示匹配一行的最后一个字符{},表示前面的 pattern 匹配多少次,如A{3}表示等价于AAA\,用于去 escape metacharacters,如\*就表示匹配字面意义上的*+,表示匹配一个或者多个前面的 regular expression。如[0-9]+就可以匹配1,11343等等?,表示匹配一个或者 0 个前面的 regular expression,如-?[0-9]+可以匹配正数,负数及 0|,表示匹配前面的 regular expression 或者后面的 regular expression,如cow|pig可以匹配 cow 或者 pig"...",表示将双引号内部的所有字符(除了 c escape sequences) literally,如"abc[d]+"匹配的就是abc[d]+/,当前一个 regular expression 接着后一个 regular expression 时才会匹配。如0/1只会 匹配01中的0,而不会匹配02中的0。(实测在 grep 中和 vim 中不好使)(),把多个字符结合起来然后组成一个新的 regular expression。如(01)+可以匹配01,0101等等。