编译原理实验⼀(C-语⾔词法分析器的编写C语⾔版本)
编译原理实验⼀(C-语⾔词法分析器的编写C语⾔版本)
⼀、tiny词法分析程序源代码阅读笔记:
重要变量和函数:
①变量和函数:
A.要计算的唯⼀特性是词法或是被识别的记号的串
变量t o k e n S t r i n g
B.扫描程序使⽤3个全程变量⽂件变量s o u r c e和l i s t i n
g,整型变量l i n e n o
C.存储当前⾏ char lineBuf[BUFLEN];
C.当前单词类型    c u r r e n t T o k e n
D.所要计算的唯⼀特性——词法或是被识别的记号
的串值。
t o k e n S t r i n g
E.标志变量被⽤作指⽰是否将⼀个字符增加到t o k
e n S t r i n g之上
s a v e
F.完成位于由g e t T o k e n的主要循环识别的标识符之后的保留字的查TokenType reservedLookup (char* s)
G.进⾏词法分析,返回下⼀个合法单词的类型TokenType getToken(void)
D.按格式打印⼀个单词void printToken( TokenType
token, const char*
tokenString )
E.从⾏缓冲中输⼊下⼀个⾮空格字符,当⾏缓冲为
空则输⼊下⼀⾏字符串。
static int getNextChar(void)
F.不读取下⼀个字符,在⾏缓冲中回退⼀个字符。static void
ungetNextChar(void)
write的返回值
②数据结构
A.状态类型(枚举)typedef enum
{ START,INASSIGN,INCOMMENT,INNUM,INID,DONE }  StateType;
B.单词类typedef enum{
ENDFILE,ERROR,
IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE,    ID,NUM, ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI
(枚
举)
} TokenType;
C.保留字的查表(结构体类型)static struct
{ char* str;
TokenType tok;
} reservedWords[MAXRESERVED]
= {{"if",IF},{"then",THEN},{"else",ELSE},{"end",END},      {"repeat",REPEAT},{"until",UNTIL},{"read",READ},      {"write",WRITE}};
有START,INASSIGN,INCOMMENT,INNUM,INID,DONE六个状态
其状态转换图:
总结:
cifa词法分析程序的主要思路是:
①从主函数环境变量中获取输⼊⽂件的名称,并判断其是否存在
②循环调⽤getToken函数进⾏词法分析,直到函数返回值位ENDFILE即到达⽂件末尾
③getToken函数中的分析思路:
1. 初始状态位START, tokenStringIndex 为0表⽰从输⼊字符串的第⼀个字符开始分析
2. 调⽤getNextChar()来获取下⼀个位置的字符
3. 在对应的状态下,根据字符的类型和DFA中的转换关系,得到当前词法单元的类型,并更新状态。
4. 在分析过程中将每个字符保存到tokenString中。
5. 直到状态STATE为DONE则该词法单元分析结束。tokenString中加⼊⼀个空字符表⽰词法单元的尾部。并且如果该词法单元为标识
符则查相应的保留字。
⼆、C-词法分析器实验报告:1.C-词法规则①语⾔的关键字:
else if int return void while
所有的关键字都是保留字,并且必须是⼩写。
②专⽤符号:
+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */
③其他标记是I D和N U M,通过下列正则表达式定义:ID = letter letter*NUM = digit digit*letter = a|..|z|A|..|Z digit = 0|..|9
⼩写和⼤写字母是有区别的。
④空格由空⽩、换⾏符和制表符组成。空格通常被忽略,除了它必须分开 I D、N U M关键字。
⑤注释⽤通常的C语⾔符号/ * . . . * /围起来。注释可以放在任何空⽩出现的位置 (即注释不能放在标记内)上,且可以超过⼀⾏。注释不能嵌套。    整理:保留字特殊符号其他else +
ID(letter letter* )letter = a|..|z|A|..|Z
if -int *return /void <while
<=>
>===!==;
NUM(digit digit*)digit = 0|..|9
,()[]{}/*/*
1. DFA:
①注释状态转换图:
②专⽤符号、ID、NUM状态转换图:
注意:
①关键字:
除了数量减少以及关键词内容有所改变以外,关键字都是由字母⼩写构成,其中不添加其他符号,所以我们在关键字处理⽅式可以使
⽤Tiny编译器的处理⽅式。
②专⽤符号:
1. 在tiny编译器的基础上,增添了有两个符号构成的符号,例如<=、>=、==、!=等,这需要在构建C-词法分析状态转换图时需要注
意;
2. <=是被当做⼩于等于⽽不是⼩于和等于两个词素的原因是我们默认遵循最长⼦串原则,其中具体构建⽅法见下⼀步。
③其他标记ID/NUM:
NUM只包括数字、ID只包括⼤⼩写字母,且字母区分⼤⼩写。
④注释:
C-语⾔的注释前置符号和后置符号都⼜两个符号构成 ’/’’*’;处理该符号时需要注意。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。