2007年11月28日星期三

lex/yacc系列:lex示例

示例1:将输入中的多个空格或者制表符压缩为一个空格,并且删除每行结尾的空格:
%%
[ \t]+ { putchar(' '); }
[ \t]+$


示例2:在输入文件的每行前面加上行号然后输出:
%{
unsigned yylineno = 1;
%}

%%
^.*\n { printf("%4d: %s", yylineno, yytext); ++yylineno; }

%%
int
main(int argc, char *argv[])
{
 if (argc > 1) {
  FILE *file = fopen(argv[1], "r");
  if (file) {
   yyin = file;
   yylex();
  }
 }
 return 0;
}

代码中的yytext包含匹配字符串。在某些lex的实现中预定义了变量yylineno

没有评论: