lex与yacc程序学习(1)——词法分析器&lex工作过程

(图 cr:王挺-国防科学技术大学-计算机学院 计算机科学与技术系 )

lex源程序分为辅助定义(AUXILIARY DEFINITION)识别规则(RECOGNITION RULES)两个部分。

辅助定义(AUXILIARY DEFINITION):用文法的形式定义一些语法单位。

把字母定义为letter,0~9定义为digit:

AUXILIARY DEFINITION
    letter->A|B|…|Z 
    digit->0|1|…|9

 这些AB既可以看成是字符、也可以是字、还可以是正规式。

这是最基本的正规式。

识别规则(RECOGNITION RULES):对应程序员单词的识别规则。

正规式+正规式所对应的单词的种别编码+自身的值,

RECOGNITION RULES
1    DIM                     {RETURN(1,-)}
2    IF                      {RETURN(2,-)}
3    DO                      {RETURN(3,-)}
4    STOP                    {RETURN(4,-)}
5    END                     {RETURN(5,-)}
6    letter(letter|digit)*   {RETURN(6,TOKEN)}
7    digit(digit)*           {RETURN(7,DTB)}
8    =                       {RETURN(8,-)}
9    +                       {RETURN(9,-)}
10   *                       {RETURN(10,-)}
11   **                      {RETURN(11,-)}
12   ,                       {RETURN(12,-)}
13   (                       {RETURN(13,-)}
14   )                       {RETURN(14,-)}

letter(letter|digit) :这条正规式识别的是以字母开头的字母数字串。

TOKEN:代表单词自身的字符串。

:识别标识符。

 digit(digit)* :识别数字串。

DTB:子程序。

:调用DTB子程序,将数字串转变为二进制常数。

每一条规则都是正规式,正规式所对应的单词的种别编码都写在对应的后面,用括号括起来。

lex程序核心:正规式+所对应的动作

LEX的工作过程:

    首先,对每条识别规则Pi 构造一个相应的非确定有限自动机Mi ;

    然后,引进一个新初态X,通过ε弧,将这些自动机连接成一个新的NFA;

    最后,把M确定化、最小化,生成该DFA的状态转换表和控制执行程序。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
%% ///////////////////////////////////////////////////////////////////////////// // rules section // place your Lex rules here "else" {printf("ELSE:%s%c ",yytext,' ');return ELSE;} "if" {printf("IF:%s%c ",yytext,' ');return IF;} "int" {printf("INT:%s%c ",yytext,' ');return INT;} "return" {printf("RETURN:%s%c ",yytext,' ');return RETURN;} "void" {printf("VOID:%s%c ",yytext,' ');return VOID;} "while" {printf("WHILE:%s%c ",yytext,' ');return WHILE;} "<" {printf("LT:%s%c ",yytext,' ');return LT;} ">" {printf("GT:%s%c ",yytext,' ');return GT;} "<=" {printf("LE:%s%c ",yytext,' ');return LE;} ">=" {printf("GE:%s%c ",yytext,' ');return GE;} "==" {printf("EQ:%s%c ",yytext,' ');return EQ;} "!=" {printf("NE:%s%c ",yytext,' ');return NE;} "{" {printf("{:%s%c ",yytext,' '); return '{';} "}" {printf("}:%s%c ",yytext,' '); return '}';} "(" {printf("(:%s%c ",yytext,' ');return '(';} ")" {printf("):%s%c ",yytext,' ');return ')';} "[" {printf("[:%s%c ",yytext,' ');return '[';} "]" {printf("]:%s%c ",yytext,' ');return ']';} "+" {printf("+:%s%c ",yytext,' ');return '+';} "-" {printf("-:%s%c ",yytext,' ');return '-';} "*" {printf("*:%s%c ",yytext,' ');return '*';} "/" {printf("/:%s%c ",yytext,' ');return '/';} "%" {printf("%:%s%c ",yytext,' ');return '%';} ";" {printf(";:%s%c ",yytext,' ');return ';';} "=" {printf("=:%s%c ",yytext,' ');return '=';} "," {printf(",:%s%c ",yytext,' ');return ',';} {id} {printf("id:%s%c ",yytext,' ');return ID;} {number} {printf("number:%s%c ",yytext,' '); return NUMBER;} "/*" { char c; int done = FALSE; ECHO; do { while((c=input())!='*') putchar(c); putchar(c); while((c=input())=='*') putchar(c); putchar(c); if(c=='/') done =TRUE; } while(!done); printf("\n: There are the conment!"); return COMMENT; } %% 程序可以正确的运行,供有需要的同学使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值