直接上代码,假设读者熟悉正则表达式

文件fruit.l

  1. %{ ----(1)
  2. /* 
  3.  * 这是个注释 
  4. */ 
  5. %} 
  6. %%  ----(2)
  7.  
  8. apple | ----(3)
  9. banana | 
  10. orange | 
  11. leechee    { printf("%s is a fruite",yytext); } ----(4)
  12.  
  13. [a-zA-Z]+    { printf("I don't know what is %s",yytext); } ----(5)
  14.  
  15. .|\n    { ECHO; } ----(6)
  16. %% 
  17.  
  18. main(){ 
  19.     yylex(); ----(7)

(1):lex将%{与%}之间的内容直接拷贝到生成文件中

(2):%%标记部分结束

(3):这一部分是匹配模式,使用的是正则表达式。|的作用是使匹配到的模式所执行的内容指向下一个匹配模式的执行内容

(4):这部分是(3)模式匹配后所要执行的内容(这里是C printf打印操作)。yytext数组包涵匹配模式的文本

(5):这个模式匹配前面没有匹配的字符。这里如果是applee这个单词,将在这里匹配,前面的模式匹配中的apple无法匹配,因为lex是以最长来匹配的,并且一旦匹配到就不会再进行匹配

(6):匹配任意单个字符(包括空字符),并使用特殊动作符号ECHO输出匹配模式

(7):最后,调用lex词法分析程序yylex()

 

接着,生成源文件和目标文件

  1. lex fruit.l ----(1)
  2. cc lex.yy.c -0 fruit -ll 

(1):这里默认生成源文件为lex.yy.c

 

测试

  1. $./fruit
  2. apple
  3. apple is a fruite 
  4. applee 
  5. I don't know what is applee