长安大学《编译原理》FLEX 中文手册.pdfVIP

  • 82
  • 0
  • 约2.03万字
  • 约 29页
  • 2018-01-15 发布于浙江
  • 举报
FLEX 中文手册 一些简单的例子 输入文件的格式 模式 如何匹配输入 动作 生成的扫描器 开始条件 文件结尾规则 与 yacc 一起使用 一、一些简单的例子 首先给出一些简单的例子,来了解一下如何使用 flex 。下面的flex 输入所定 义的扫描器,用来将所有的“ username”字符串替换为用户的登陆名字: %% username printf(%s, getlogin()); 默认情况下,flex 扫描器无法匹配的所有文本将被复制到输出,所以该扫描 器的实际效果是将输入文件 复制到输出,并对每一个“username”进行展开。在这个例子中,只有一个规 则。“username”是模式 (pattern),“printf”是动作(action )。“%%”标志着规则的开始。 这里是另一个简单的例子: int num_lines = 0, num_chars = 0; %% \n ++num_lines; ++num_chars; . ++num_chars; %% int main(void) { yylex(); printf(# of lines = %d, # of chars = %d\n, num_lines, num_chars); } 该扫描器计算输入的字符个数和行数(除了最后的计数报告,并未产生其它 输出)。第一行声明了两 个全局变量,“num_lines”和“num_chars”,可以在 yylex() 函数中和第二个 “%%”后面声明的 main()函数中 使用。有两个规则,一个是匹配换行符(“\n”)并增加行数和字符数,另一个 是匹配所有不是换行符的 其它字符(由正规表达式“.”表示)。 一个稍微复杂点的例子: /* scanner for a toy Pascal-like language */ %{ /* need this for the call to atof() below */ #include math.h %} DIGIT [0-9] ID [a-z][a-z0-9]* %% {DIGIT}+ { printf( An integer: %s (%d)\n, yytext, atoi( yytext ) ); } {DIGIT}+.{DIGIT}* { printf( A float: %s (%g)\n, yytext, atof( yytext ) ); } if|then|begin|end|procedure|function { printf( A keyword: %s\n, yytext ); } {ID} printf( An identifier: %s\n, yytext ); +|-|*|/ printf( An operator: %s\n, yytext ); {[^}\n]*} /* eat up one-line comments */ [ \t\n]+ /* eat up whitespace */ . printf( Unrecognized character: %s\n, yytext ); %% int main(int argc, char **argv) { ++argv, --argc; /* skip over program name */ if ( argc 0 ) yyin = fopen( argv[0], r ); else yyin = stdin; yylex(); } 这是一个类似 Pascal 语言的简单扫描器的初始部分,用来识别不同类型的标 志(tokens )并给出报告。 这个例子的详细介绍将在后面的章节中给出。 二、输入文件的格式 flex 输入文件包括三个部分,通过“%%”行来分开: definitions (定义)%% rules (规则)%% user code (用户代码)

文档评论(0)

1亿VIP精品文档

相关文档