编译原理词法分析__Lex

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

举例: Lex源程序
输入串中 单词的个数 和 字符的个数 记数 [a-zA-Z]+ { words++; chars+= yyleng; }
举例: Lex源程序 - Regular Definitions
delim ws letter digit id number [ \t\n] {delim}+ [A-Za-z] [0-9] {letter} ( {letter} | {digit} )* {digit}+ (\. {digit}+)? (E [+-]?{digit}+)?
(2). 转换规则
P1 {action 1} P2 {action 2} …… Pn {action n}
Pattern
[a-z]+ printf(“%s”,yytext) NUMBER { printf(“NUMBERFOUND” ) }
lex提供的外部数据结构
• • • • yytext : 当前被匹配的字符串 yyleng: yytext中字符的个数 ECHO: 宏,Printf(“%s”,yytext) yyval: 全局变量, 和语法分析程序共享, 一般用来存放单词属性值
花括号括起来的部分不是必须的
(1). 辅助定义
d1→r1 d2→r2 … dn→rn letter → A|B|…|Z|a|b|…|z digit → 0|1|…|9 id → letter(letter | digit)*
NUMBER [0-9][0-9]* IDENT [a-zA-Z][a-zA-Z0-9]*
补充资料
• Lex 补充文档 • Lex 源程序示例
3. Lex中的冲突解决
• 匹配最长子串 • 匹配最先列出的模式
练习
生成词法分析器scanner的LEX源文件如下,请给出 scanner对输入串 ababcbacaabaababaa 的输出结果 %% a+b*a (ab)+c? aa (a|b)*c 2 {printf("1 %s\n", yytext);} 4 {printf("2 %s\n", yytext);} 1 {printf("3 %s\n", yytext);} 2 {printf("4 %s\n", yytext);} 1 ababc bac aaba abab aa
%% [a-z] printf("%c",yytext[0]+'A'-'a'); %%
int yywrap(void) { return 1; }
main() { yylex(); }
2. Lex程序的结构
{辅助定义 %% {转换规则 %% {用户子程序 Definitions/Declarations } Rules } User subroutines }
补充作业: 请给出scanner对以下输入串的输出结果 (1) aaaabbbbcccc (2) aaabbaaababccabbaac
* 4. 向前看运算符 /
举例: 转换规则
{ws} if then else {id} {number} “<” “<=” “=” “<>” “>” “>=” { /* no action and no return */ } { return(IF) ; } { return(THEN) ; } { return(ELSE) ; } { yylval = (int) installID(); return(ID); } { yylval = (int) installNum(); return(NUMBER); } { yylval = LT; return(REL0P) ; } { yylval = LE; return(REL0P) ; } { yylval = EQ; return(REL0P) ; } { yylval = NE; return(REL0P); } { yylval = GT; return(REL0P); } { yylval = GE; return(REL0P); }
词法分析器自动生成工具Lex
1. 2. 3. 4. Lex的使用 Lex程序的结构 Lex中的冲突解决 向前看运算符 *
1. Lex的使用
Lex 源程序 test.l lex.yy.c Lex Compiler C Compiler a.out lex.yy.c
ຫໍສະໝຸດ Baidua.out
字符流
单词序列
演示: Flex
相关文档
最新文档