概述
用 FLEX编写一个词法分析器,能够将输入的源程序转换为单词序列输出。
实验要求
- 该语言的关键字:if while do break real true false int char bool float (其中,int、char、bool、float在产生式中为basic)
- id和num的正则表达式定义
- 专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */
- 空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开id,num关键字。
- 程序书写格式自由:一行可以有多个语句,一个语句也可以有多行,单词之间可以插入任意空格。
- 考虑注释。注释由/*和*/包含。注释可以放在任何空白出现的位置,且可以超过一行。注释不能嵌套。
输出示例
源程序输入:
{ int i; if ( i >= 0) i = i + 1; }
输出token序列如下:
{,
int,
(id, i)
;,
if,
(,
(id, i)
=,
(num, 0)
(id, i)
=,
(id, i)
+,
(num, 1)
实现思路
1.简单字符正则表达式
- 常用字符的识别
delim [ \t\n]
ws {
delim}+
letter [A-Za-z]
digit [0-9]
id {
letter}({
letter}|{
digit})*
number {
digit}+(\.{
digit}+)?(E[+-]?{
digit}+)?
- 关键字的识别
if|then|else|for|while|return|main|do|break
{
printf("A keyword: %s\n", yytext);}
- 变量类型的识别
int|char|float
{
printf("A value type: %s\n", yytext);}
- 单行注释的识别
\/\/([^\n])+
{
printf("line comments : %s\n",yytext);}
2.单操作数运算符的处理
这里只考虑自增“++”和自减“–”的情况。对于单个加号和单个减 号来说,直接识别操作符即可,为了防止连续识别出两个单加号或着两个单减号,对识别加号和减号的处理方式进行一定的修改。
即,拿加号举例子,若识别到一个加号,先不着急将判断结果输出,而是往后面预读一个字符,若检测到后面的字符也为加号,则判断为自增“++”,否则为二目运算符加号,自减“–”同理。最后还应将预读的字符放回缓冲区。
具体实现如下:
{
addop} {
char c;
if((c=input())=='+')
printf("A single operator: %s%c\n",yytext,c);
else {
printf("An operator: %s\n", yytext);unput(c);}
}
{
subop} {
char c;
if((c=input())=='-'<