其他分享
首页 > 其他分享> > Lex&Yacc 编译原理课设

Lex&Yacc 编译原理课设

作者:互联网

Lex&Yacc

1 知识储备:

1.1 工具

1.1.1 Bison

bison是一个通用解析器生成器,将LALR(1)上下文无关文法转变成一个解析该语法的C程序,可被用于开发各种语言的解析器,向上兼容Yacc,用C开发语法解析器时要安装Bison

1.1.2 Flex

flex是一个高速的词法分析器生成器,可用于对文字(text)进行模式匹配(pattern-matching), 它是lex的众多版本之一,选择flex是因为可以方便的在Windows系统安装

1.1.3 GCC(GNU Compiler Collection)

bison和flex需要的编译包都是GnuWin32,在win环境下,使用MinGW工具安装gcc编译环境

1.2 编译器原理概述

1.2.1 编程语言的编译器通常可被分为五个阶段:

  1. 词法分析:分析源码,扫描字符串,分离出所有语法单位(tokens), 这个任务可由Lex自动化完成
  2. 语法分析:分析词法分析传来的tokens, 找出符合规定的语法,确定整个输入串能否构成语法正确的句子和程序,这个任务可由Yacc自动化完成
  3. 中间代码生成:在语法分析正确的基础上,按照语义规则产生介于源语言和目标代码之间的代码,中间代码不依赖于机器,同时便于产生依赖于机器的代码
  4. 优化:依据等价变换原则,对中间代码进行加工变换,以便在后期生成高效的代码
  5. 目标代码生成:将优化后的中间代码转换成具体机器的指令序列

1.2.2 词法分析

定义

词法分析器以词法定义为基础,词法定义用正则表达式(正规文法)表示

正则表达式 ->NFA(不确定有限自动机)->DFA(确定有限自动机)->DFA最小化

功能

读取源代码,根据定义的词法分析识别单词,构造词法单元(token),检查此法错误,最后输出token序列(用二元组表示)

token

1.2.3 语法分析

定义

以语法定义(上下文无关文法)为基础,语法定义用产生式表示

功能

读取词法分析器传来的词法单元序列,根据语法定义生成语法结构(组词成句)

语法结构

描述程序结构,例如:

Program -> Type main() Block
Type -> int | bool
Block -> { Stmts return Num ; }
Decl -> Type Array ;
Array -> Identifier [ Num ] | Identifier [ Identifier ] | Identifier
Stmts -> Stmts M Stmt | Stmt
上下文无关文法(context-free grammar)

2 Lex

生成词法分析器源码,lex.yy.c

2.1 Lex用于消除歧义的规则:

  1. 优先原则,只匹配字符或字符串一次,如果出现单词与两个规则都匹配,匹配靠前的规则
  2. 最长字串匹配原则,执行能匹配到的最长的匹配对应的action

2.2 lex语法分为三段

每段之间用**%%**隔开

2.2.1 定义部分:

2.2.2 规则部分:

2.2.3 子程序部分

2.3 Lex对比C写出来的词法分析器

2.4 lex.yy.c中的全局变量和函数

2.4.1 变量

2.4.2 函数

2.5 flex词法分析产生器实现过程

词法分析器自动生成器的核心是lex编译器,lex编译器的功能是对某语言单词集描述的lex源程序,将其变换为一个能识别该语言单词的词法分析器。而该词法分析器像有限自动机一样取识别处理单词。

基于lex源程序,lex编译器的实现步骤大致是:

  1. 对lex源程序识别规则中的每个pi构造一个相应的NFA Ni
  2. 引入唯一初态S,从初态S通过ε弧将所有NFA Ni(i=1,…,n)连接成新的NFA N’
  3. 对NFA N’确定化,产生DFA N
  4. DFA N 最小化
  5. 给出控制程序。控制程序的作用是激活有限自动机,即控制输入字符串在有限自动机上运行,一旦达到终态,即识别出lex源程序模式描述的某个单词,转去调用相应的动作部分就可以了

3 Yacc

生成语法分析器源码y.tab.c 存放LALR分析表

和包含了token的枚举定义的头文件y.tab.h

3.1 Yacc parser分为三部分

每段之间用**%%**隔开

3.1.1定义部分

%{ 
/*
* 这是一个Yacc的定义部分
*/
#include <stdio.h> 
%}

3.1.2 语法规则部分

3.1.3 子程序部分

3.2 Yacc中的函数

3.3 生成语法树

3.4 Yacc使用的自下而上的LALR(1)算法(Look Ahead LR)

3.4.1 自上而下和自下而上

3.4.2 LR分析器

“历史”“现实”“展望”备注
LR(0)××
SLR×考虑了一点点现实
LR(1)向前展望一个符号,表格尺寸较大
LALR(1)简化了的LR(1),表格尺寸缩小了

3.4.3 LALR(1)

对比LR(1):
基本思想:
构造LALR分析表时

3.4.4 Note

由于Yacc使用的是LALR(1)算法,它不能识别过于模糊的语法,例如

3.5 Yacc自动生成LALR(1)分析表

3.5.1 构造LALR(1)分析表的主要步骤

  1. 构造文法的项目集族
  2. 把所有同心集合并到一起,生成新的集族
  3. 用新的集族构造 ACTION表
  4. 构造GOTO表

这些步骤手动完成很麻烦,自动化生成这样的表就变得很有必要

3.5.2 用--v选项生成.output文件来查看生成的表

以本次实验中的一个状态为例:

state 131

   61 iteration_statement: FOR OPAIR expression_statement expression_statement . CPAIR statement
   62                    | FOR OPAIR expression_statement expression_statement . expression CPAIR statement

    OPAIR       shift, and go to state 21    //对应ACTION表的部分,读到终结符(时,(入栈,跳到状态21
    CPAIR       shift, and go to state 136
    SELMIN      shift, and go to state 22
    SELADD      shift, and go to state 23
    NOT         shift, and go to state 24
    NUM         shift, and go to state 25
    IDENTIFIER  shift, and go to state 26

    constant_expression  go to state 27    //对应GOTO表的部分,读到非终结符常量表达式时,转到状态27
    expression           go to state 137
    unary_expression     go to state 29
    postfix_expression   go to state 30
    primary_term         go to state 31
    primary_expression   go to state 32

4 编译运行Lex和Yacc

4.1 编译

bison -d -v --debug tinyC.y
flex tinyC.l
gcc -o tinyC tinyC.tab.c lex.yy.c -lfl -ly -LC:\GnuWin32\lib

4.2 运行结果

====begin parsing test.txt====
/* 111
this is comment
222 */
#include<stdio.h>
< INT, int >  < ID, a >  < ASSIGN, = >  < NUM, 1 >  < SC, ; >
< INT, int >  < ID, f >  < OPAIR, ( >  < INT, int >  < ID, a >  < CPAIR, ) >  < SC, ; >
< INT, int >  < ID, main >  < OPAIR, ( >  < CPAIR, ) >
< OSP, { >
< INT, int >  < ID, a >  < ASSIGN, = >  < NUM, 9 >  < SC, ; >
< FLOAT, float >  < ID, b >  < ASSIGN, = >  < NUM, 9.1 >  < SC, ; >
< WHILE, while >  < OPAIR, ( >  < ID, a >  < LT, < >   < NUM, 10 >  < CPAIR, ) >  < OSP, { >
< ID, a >  < SELADD, ++ >  < SC, ; >  hahahaha
< CSP, } >
< FOR, for >  < OPAIR, ( >  < SC, ; >  < ID, b >  < COMPARE, == >  < NUM, 9.1 >  < SC, ; >  hahahaha< CPAIR, ) >  < OSP, { >
< CSP, } >
< IF, if >  < OPAIR, ( >  < NUM, 1 >  < CPAIR, ) >  < OSP, { >
< CSP, } >
< RETURN, return >  < NUM, 0 >  < SC, ; >
< CSP, } >
< VOID, void >  < ID, f >  < OPAIR, ( >  < INT, int >  < ID, a >  < CPAIR, ) >
< OSP, { >
< FLOAT, float >  < ID, b >  < ASSIGN, = >  < NUM, 0.0 >  < SC, ; >
< SWITCH, switch >  < OPAIR, ( >  < ID, a >  < CPAIR, ) >
< OSP, { >
< CASE, case >  < NUM, 0 >  < COLON, : >  < BREAK, break >  < SC, ; >
< CASE, case >  < NUM, 2 >  < COLON, : >  < BREAK, break >  < SC, ; >
< DEFAULT, default >  < COLON, : >  < BREAK, break >  < SC, ; >
< CSP, } >
< CSP, } >
****the file is end****
====end parsing====
Parse Tree:
start
  |-->start
  |     |-->start
  |     |     |-->start
  |     |     |     |-->start_part
  |     |     |           |-->extern_declaration
  |     |     |                 |-->declaration
  |     |     |                       |-->type_specifier
  |     |     |                       |     |-->INT
  |     |     |                       |-->declarator
  |     |     |                       |     |-->direct_declarator
  |     |     |                       |           |-->IDENTIFIER
  |     |     |                       |           |-->ASSIGN
  |     |     |                       |           |-->expression
  |     |     |                       |                 |-->primary_expression
  |     |     |                       |                       |-->primary_term
  |     |     |                       |                             |-->constant_expression
  |     |     |                       |                                   |-->NUM
  |     |     |                       |-->SC
  |     |     |-->start_part
  |     |           |-->extern_declaration
  |     |                 |-->function_declaration
  |     |                       |-->type_specifier
  |     |                       |     |-->INT
  |     |                       |-->IDENTIFIER
  |     |                       |-->OPAIR
  |     |                       |-->parameter_type_list
  |     |                       |     |-->parameter_type_declaration
  |     |                       |           |-->type_specifier
  |     |                       |           |     |-->INT
  |     |                       |           |-->IDENTIFIER
  |     |                       |-->CPAIR
  |     |                       |-->SC
  |     |-->start_part
  |           |-->function_definition
  |                 |-->type_specifier
  |                 |     |-->INT
  |                 |-->IDENTIFIER
  |                 |-->OPAIR
  |                 |-->CPAIR
  |                 |-->compound_statement
  |                       |-->OSP
  |                       |-->declaration_list
  |                       |     |-->declaration_list
  |                       |     |     |-->declaration
  |                       |     |           |-->type_specifier
  |                       |     |           |     |-->INT
  |                       |     |           |-->declarator
  |                       |     |           |     |-->direct_declarator
  |                       |     |           |           |-->IDENTIFIER
  |                       |     |           |           |-->ASSIGN
  |                       |     |           |           |-->expression
  |                       |     |           |                 |-->primary_expression
  |                       |     |           |                       |-->primary_term
  |                       |     |           |                             |-->constant_expression
  |                       |     |           |                                   |-->NUM
  |                       |     |           |-->SC
  |                       |     |-->declaration
  |                       |           |-->type_specifier
  |                       |           |     |-->FLOAT
  |                       |           |-->declarator
  |                       |           |     |-->direct_declarator
  |                       |           |           |-->IDENTIFIER
  |                       |           |           |-->ASSIGN
  |                       |           |           |-->expression
  |                       |           |                 |-->primary_expression
  |                       |           |                       |-->primary_term
  |                       |           |                             |-->constant_expression
  |                       |           |                                   |-->NUM
  |                       |           |-->SC
  |                       |-->statement_list
  |                       |     |-->statement_list
  |                       |     |     |-->statement_list
  |                       |     |     |     |-->statement_list
  |                       |     |     |     |     |-->statement
  |                       |     |     |     |           |-->iteration_statement
  |                       |     |     |     |                 |-->WHILE
  |                       |     |     |     |                 |-->OPAIR
  |                       |     |     |     |                 |-->expression
  |                       |     |     |     |                 |     |-->primary_expression
  |                       |     |     |     |                 |           |-->primary_expression
  |                       |     |     |     |                 |           |     |-->primary_term
  |                       |     |     |     |                 |           |           |-->postfix_expression
  |                       |     |     |     |                 |           |                 |-->unary_expression
  |                       |     |     |     |                 |           |                       |-->IDENTIFIER
  |                       |     |     |     |                 |           |-->binary_operation
  |                       |     |     |     |                 |           |     |-->LT
  |                       |     |     |     |                 |           |-->primary_term
  |                       |     |     |     |                 |                 |-->constant_expression
  |                       |     |     |     |                 |                       |-->NUM
  |                       |     |     |     |                 |-->CPAIR
  |                       |     |     |     |                 |-->statement
  |                       |     |     |     |                       |-->compound_statement
  |                       |     |     |     |                             |-->OSP
  |                       |     |     |     |                             |-->statement_list
  |                       |     |     |     |                             |     |-->statement
  |                       |     |     |     |                             |           |-->expression_statement
  |                       |     |     |     |                             |                 |-->expression_list
  |                       |     |     |     |                             |                 |     |-->expression
  |                       |     |     |     |                             |                 |           |-->primary_expression
  |                       |     |     |     |                             |                 |                 |-->primary_term
  |                       |     |     |     |                             |                 |                       |-->postfix_expression
  |                       |     |     |     |                             |                 |                             |-->postfix_expression
  |                       |     |     |     |                             |                 |                             |     |-->unary_expression
  |                       |     |     |     |                             |                 |                             |           |-->IDENTIFIER
  |                       |     |     |     |                             |                 |                             |-->SELADD
  |                       |     |     |     |                             |                 |-->SC
  |                       |     |     |     |                             |-->CSP
  |                       |     |     |     |-->statement
  |                       |     |     |           |-->iteration_statement
  |                       |     |     |                 |-->FOR
  |                       |     |     |                 |-->OPAIR
  |                       |     |     |                 |-->expression_statement
  |                       |     |     |                 |     |-->SC
  |                       |     |     |                 |-->expression_statement
  |                       |     |     |                 |     |-->expression_list
  |                       |     |     |                 |     |     |-->expression
  |                       |     |     |                 |     |           |-->primary_expression
  |                       |     |     |                 |     |                 |-->primary_expression
  |                       |     |     |                 |     |                 |     |-->primary_term
  |                       |     |     |                 |     |                 |           |-->postfix_expression
  |                       |     |     |                 |     |                 |                 |-->unary_expression
  |                       |     |     |                 |     |                 |                       |-->IDENTIFIER
  |                       |     |     |                 |     |                 |-->binary_operation
  |                       |     |     |                 |     |                 |     |-->COMPARE
  |                       |     |     |                 |     |                 |-->primary_term
  |                       |     |     |                 |     |                       |-->constant_expression
  |                       |     |     |                 |     |                             |-->NUM
  |                       |     |     |                 |     |-->SC
  |                       |     |     |                 |-->CPAIR
  |                       |     |     |                 |-->statement
  |                       |     |     |                       |-->compound_statement
  |                       |     |     |                             |-->OSP
  |                       |     |     |                             |-->CSP
  |                       |     |     |-->statement
  |                       |     |           |-->selection_statement
  |                       |     |                 |-->IF
  |                       |     |                 |-->OPAIR
  |                       |     |                 |-->expression
  |                       |     |                 |     |-->primary_expression
  |                       |     |                 |           |-->primary_term
  |                       |     |                 |                 |-->constant_expression
  |                       |     |                 |                       |-->NUM
  |                       |     |                 |-->CPAIR
  |                       |     |                 |-->statement
  |                       |     |                       |-->compound_statement
  |                       |     |                             |-->OSP
  |                       |     |                             |-->CSP
  |                       |     |-->statement
  |                       |           |-->jump_statement
  |                       |                 |-->RETURN
  |                       |                 |-->expression
  |                       |                 |     |-->primary_expression
  |                       |                 |           |-->primary_term
  |                       |                 |                 |-->constant_expression
  |                       |                 |                       |-->NUM
  |                       |                 |-->SC
  |                       |-->CSP
  |-->start_part
        |-->function_definition
              |-->type_specifier
              |     |-->VOID
              |-->IDENTIFIER
              |-->OPAIR
              |-->parameter_type_list
              |     |-->parameter_type_declaration
              |           |-->type_specifier
              |           |     |-->INT
              |           |-->IDENTIFIER
              |-->CPAIR
              |-->compound_statement
                    |-->OSP
                    |-->declaration_list
                    |     |-->declaration
                    |           |-->type_specifier
                    |           |     |-->FLOAT
                    |           |-->declarator
                    |           |     |-->direct_declarator
                    |           |           |-->IDENTIFIER
                    |           |           |-->ASSIGN
                    |           |           |-->expression
                    |           |                 |-->primary_expression
                    |           |                       |-->primary_term
                    |           |                             |-->constant_expression
                    |           |                                   |-->NUM
                    |           |-->SC
                    |-->statement_list
                    |     |-->statement
                    |           |-->selection_statement
                    |                 |-->SWITCH
                    |                 |-->OPAIR
                    |                 |-->expression
                    |                 |     |-->primary_expression
                    |                 |           |-->primary_term
                    |                 |                 |-->postfix_expression
                    |                 |                       |-->unary_expression
                    |                 |                             |-->IDENTIFIER
                    |                 |-->CPAIR
                    |                 |-->statement
                    |                       |-->compound_statement
                    |                             |-->OSP
                    |                             |-->statement_list
                    |                             |     |-->statement_list
                    |                             |     |     |-->statement_list
                    |                             |     |     |     |-->statement
                    |                             |     |     |           |-->labeled_statement
                    |                             |     |     |                 |-->CASE
                    |                             |     |     |                 |-->constant_expression
                    |                             |     |     |                 |     |-->NUM
                    |                             |     |     |                 |-->COLON
                    |                             |     |     |                 |-->statement
                    |                             |     |     |                       |-->jump_statement
                    |                             |     |     |                             |-->BREAK
                    |                             |     |     |                             |-->SC
                    |                             |     |     |-->statement
                    |                             |     |           |-->labeled_statement
                    |                             |     |                 |-->CASE
                    |                             |     |                 |-->constant_expression
                    |                             |     |                 |     |-->NUM
                    |                             |     |                 |-->COLON
                    |                             |     |                 |-->statement
                    |                             |     |                       |-->jump_statement
                    |                             |     |                             |-->BREAK
                    |                             |     |                             |-->SC
                    |                             |     |-->statement
                    |                             |           |-->labeled_statement
                    |                             |                 |-->DEFAULT
                    |                             |                 |-->COLON
                    |                             |                 |-->statement
                    |                             |                       |-->jump_statement
                    |                             |                             |-->BREAK
                    |                             |                             |-->SC
                    |                             |-->CSP
                    |-->CSP
请按任意键继续. . .

5 问题与解决方法

6 源码

标签:课设,--,primary,Yacc,SC,NUM,statement,Lex,expression
来源: https://blog.csdn.net/chilemaworld/article/details/110008842