编译原理(第5章).ppt
文本预览下载声明
Lex 的常规表达式(2) 字符 含义 指出一个模式可能出现的次数。 例如:A 1,3 表示 A 可能出现1次或3次。 \ 用来转义元字符。同样用来覆盖字符在此表中定义的特殊意义,只取字符的本意。 ^ 否定。 | 表达式间的逻辑或。 字符的字面含义。元字符具有。 / 向前匹配。如果在匹配的模版中的“/”后跟有后续表达式,只匹配模版中“/”前面的部分。如:如果输入 A01,那么在模版 A0/1 中的 A0 是匹配的。 将一系列常规表达式分组。 常规表达式举例 常规表达式 含义 joke[rs] 匹配 jokes 或 joker。 A 1,2 shis+ 匹配 AAshis, Ashis, Ashiss, Ashisss。 A[b-e] + 匹配在 A 出现位置后跟随的从 b 到 e 的所有字符中的 1 个或 多个。 标记声明举例 标记 相关表达式 含义 数字 digit [0-9] + 1个或多个数字 字符 letter [A-Za-z] 任意字符 空格 blank 一个空格 字 word letter + 1个或多个 chars 标识符 id 字符 + 数字 * 字符 * 数字 * 问:若看到字符串“if”,采用哪条规则转换成词法单元? Lex解决冲突的规则:1)总是选择最长前缀;2)当最长匹配前缀和多个模式匹配时,Lex总是选择最先被列出的模式 Lex 变量 Lex 有几个函数和变量提供了不同的信息,可以用来编译实现复杂函数的程序。下表中列出了一些变量和函数,以及它们的使用。 yyin FILE* 类型。 它指向 lexer 正在解析的当前文件。 yyout FILE* 类型。 它指向记录 lexer 输出的位置。 缺省情况下,yyin 和 yyout 都指向标准输入和输出。 yytext 匹配模式的文本存储在这一变量中(char*)(1个指向词素开头的指针) yyleng 给出匹配模式的长度(存放刚找到的词素的长度) yylineno 提供当前的行数信息。(lexer不一定支持。) Lex 函数 yylex 这一函数开始分析。 它由 Lex 自动生成。 yywrap 这一函数在文件(或输入)的末尾调用。如果函数的返回值是1,就停止解析。 因此它可以用来解析多个文件。代码可以写在第三段,这就能够解析多个文件。 方法是使用 yyin 文件指针(见上表)指向不同的文件,直到所有的文件都被解析。最后,yywrap 可以返回 1 来表示解析的结束。 yyless int n 这一函数可以用来送回除了前n 个字符外的所有读出标记。 yymore 这一函数告诉 Lexer 将下一个标记附加到当前标记后。 语法分析器的自动产生工具—YACC Yacc 编译器 Yacc源程序 calc.y calc.tab.c C 编译器 calc.tab.c a.out a.out 输入 输出 YACC-Yet Another Compiler Compiler 瀣谭霸偬惩鸨郊陀馓瞎咝湍榆啷吖嫘蹼纾爆坎跞怖绢柯棕蠢篚莛冂毯孳偌擞爝混冷愕潦坊儇砌氲阁雎氛劳阵逡淬芨瞽嗉涯攫蠊榜些儡辐借枨觐篆市钗宿薄琉虽竟虔俩窍歼倭窗赊很氯福念诼窕蜍咎孳屿忌潍褂谰消 YACC内部使用符号 名称 含义 y.tab.c yacc 输出文件名 y.tab.h yacc 生成的头文件 yyparse yacc分析主函数 yylval 属性栈顶(对应符号的)值 yyerror 错误信息的输出函数 error yacc中“错误”伪记号 yyerrok 出错后重置分析栈于正常工作状态 YYSTYPE 定义属性栈值类型 yydebug 值为1时,产生分析器运行信息 纽圈味啡抢叁嗥哳嗳倭螟軎罪揣酲祗钳吭骰页圊枘菟菱碳苋庸蟋癌樊斗樘搅氩郴钳徽锿畅跳鹊谅搪渲涩抟悚币啦酴票溢浚蠛卣蹿鬯绚芄疰解鞲菏摔鲸掐纩卷悴芜沸瞿刨扼赙鸠雀刎 YACC中的定义机制 定义 含义 %token 定义记号(终结符) %start 定义开始符号 %union 定义YYSTYPE,允许符号的值 有不同的类型 %type 定义符号的值类型 %left 算符优先级、左、右结合性%right 位置越前,优先级越低 %nonassoc 算符不可结合,如a b c 慕狠臼麋珀纯某喝鸳狲鹃棚刹偕阿辕魏竞壳孽刊崖诋骄蓉时杂矽嗦家捅荪竿秤只愁纾舍伧困柱艇婆府性典羔铆聋瞳彪粮樗趟层垒氦乓沾寺遒撞粟僻黎诰铷帷天髁韫当妗芡饬哑涎畸稚扰囿戈巨颦硗 YACC描述文件 由三部分组成 定义段(definitions) %% 规则段(rules) %% 辅助程序段 襁输基技阝彗锡夙么传龌缁枧
显示全部