词法分析

  词法分析

要求:

编制一个读单词过程,源程序为一个文件,读取该文件,识别出各个具有独立意义的单词,并依次输出各个单词的内部编码及单词符号自身值。

单词的内部编码如下:

1、保留字:mainifintforwhiledoreturnbreakcontinue单词种别码分别为1~9,输出的二元组形式为(单词种别码,0

2、标识符:除保留字外的以字母开头,后跟字母、数字的字符序列单词种别码为20,输出的二元组形式为(单词种别码,标识符的名字);

3、常数为无符号整型数;单词种别码为30,输出的二元组形式为(单词种别码,常数值);

4、运算符包括:+-*/=><>=<===!=;单词种别码为41~51,输出的二元组形式为(单词种别码,0;

5、分隔符包括:,;{}(); 单词种别码为61~66,输出的二元组形式为(单词种别码,0

单词符号

种别码

单词符号

种别码

main

1

/

44

int

2

=

45

if

3

>

46

for

4

<

47

while

5

>=

48

do

6

<=

49

return

7

==

50

break

8

!=

51

continue

9

,

61

ID

20

;

62

NUM

30

{

63

+

41

}

64

-

42

(

65

*

43

)

66

 

 

举例

源程序文件内容如下:

main()

{

int  a, b;

a = 10;

     b = a + 20;

}

要求输出如下:

(10)

(650

(660)

(630)

(20)

 

source code:

#include <stdio.h>
#include<stdlib.h>
#include <ctype.h>
char a[10];//用于存储待识别的标识符或关键字
char *p=a;
void token_scan();
int qiseq(char *p,char *q);

typedef struct token
{
 char *kind;
 int value;
 char *word;
}TOKEN;
TOKEN token[28]=
{
 
 {"1",0,"main"},// main
 {"2",0,"int"},// int
 {"3",0,"if"},// if
 {"4",0,"for"},// for
 {"5",0,"while"},// while 
 {"6",0,"do"},// do
 {"7",0,"return"},// return
 {"8",0,"break"},// break
 {"9",0,"continue"},// continue

 {"20",0},//10 ID
 {"30",0},//11 NUM

 {"41",0,},//12 +
 {"42",0,},//13 -
 {"43",0,},//14 *
 {"44",0,},//15 /
 {"45",0,},//16 = 
 {"46",0,},//17 >
 {"47",0,},//18 <
 {"48",0,},//19 >=
 {"49",0,},//20 <=
 {"50",0,},//21 ==
 {"51",0,},//22 !=
 
 {"61",0,},//23 ,
 {"62",0,},//24 ;
 {"63",0,},//25 {
 {"64",0,},//26 }
 {"65",0,},//27 (
 {"66",0,},//28 )
};


void main()
{
 token_scan();
 getchar();
 
 
}

int qiseq(char *p,char *q)
{
 //u判断两字符串的内容是否相等,若相等返回1,不等返回0
 while(*(p++)!='/0'&&*(q++)!='/0')
 {
      if(*p==*q) continue;
   else
    return 0;
 }
 if(*p!='/0'||*q!='/0') 
  return 0;
 else
  return 1;
}
void token_scan()
{
 //模拟词法分析程序,每次读入一个单词,返回(单词种别,属性值)
  FILE *fp;
 char ch;
 
 int i=0;
 int j=0;
 fp=fopen("file.txt","r");
 if (fp==NULL)
 { printf("cannot open file/n");exit(0);}
ch=fgetc(fp);
while(ch!=EOF)
{
if(isalpha(ch))
{   i=0;
 a[i++]=ch;
 ch=fgetc(fp);
 while(isalnum(ch)||isalpha(ch))
 { a[i++]=ch;ch=fgetc(fp);}
 p=a;
    for(i=0;i<8;i++)
 {
 if(qiseq(p,token[i].word))
 {
   printf("(%s,0)/n",token[i].kind);
  goto loop;
 }
 }
   printf("(20,/"%s/")/n",a);
loop:
   j=0;
 while(a[j]!='/0')
    a[j++]='/0';
}
else if(isdigit(ch))
{  i=0;
 while(isdigit(ch))
{
 if(isdigit(ch))
 {
  a[i++]=ch;ch=fgetc(fp);}
 else break;
}
   printf("(30,%s)/n",a);
   j=0;
   while(a[j]!='/0')
    a[j++]='/0';
}
else
switch(ch)
{
 
case '=':
 ch=fgetc(fp);
 if(ch=='=')
 {
  printf("(%s,%d)/n",token[20].kind,token[20].value);
 ch=fgetc(fp);
 }
 else
 printf("(%s,%d)/n",token[15].kind,token[15].value);
    //ch=fgetc(fp);
 break;
case '+':
 ch=fgetc(fp);
 printf("(%s,%d)/n",token[11].kind,token[11].value);
    //ch=fgetc(fp);
 break;
case '-':
 ch=fgetc(fp);
 
 printf("(%s,%d)/n",token[12].kind,token[12].value);
    //ch=fgetc(fp);
 break;
case '(':
 ch=fgetc(fp);
 printf("(%s,%d)/n",token[26].kind,token[26].value);
    //ch=fgetc(fp);
 break;
case ')':
 ch=fgetc(fp);
 printf("(%s,%d)/n",token[27].kind,token[27].value);
    //ch=fgetc(fp);
 break;
case ',':
 ch=fgetc(fp);
 printf("(%s,%d)/n",token[22].kind,token[22].value);
    //ch=fgetc(fp);
 break;
case ';':
 ch=fgetc(fp);
 printf("(%s,%d)/n",token[23].kind,token[23].value);
    //ch=fgetc(fp);
 break;
case '{':
 ch=fgetc(fp);
 printf("(%s,%d)/n",token[24].kind,token[24].value);
    //ch=fgetc(fp);
 break;
case '}':
 ch=fgetc(fp);
 printf("(%s,%d)/n",token[25].kind,token[25].value);
    //ch=fgetc(fp);
 break;
default:
 
 ch=fgetc(fp);
 
}
}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实验一:词法分析 一、实验目的 通过设计一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 二、实验预习提示 1、 词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号对应一个种别码的方式。 2、 单词的BNF表示 ----> ----> ----> + ----> - 等等 3、 模块结构(见课本P95-96)(可根据自己的理解适当修改) 三、实验过程和指导: (一) 准备: 1. 阅读课本有关章节,明确语言的语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。 2. 初步编制好程序。 3. 准备好多组测试数据。 (二) 上机: (三) 程序要求: 1. 要求用C++Builder或者Dephi或者VC、VB等可视化编程工具编写;要求有界面(即一般windows下应用程序界面)。 2. 输入为某语言源代码。 程序输入/输出示例: 如源程序为C语言。输入如下一段: main() { int a,b; a=10; b=a+20; } 要求输出如下(并以文件形式输出)。 (2,”main”) (5,”(“) (5,”)“) (5,”{“} (1,”int”) (2,”a”) (5,”,”) (2,”b”) (5,”;”) (2,”a”) (4,”=”) (3,”10”) (5,”;”) (2,”b”) (4,”=”) (2,”a”) (4,”+”) (3,”20”) (5,”;”) (5,”}“) 注:为右大括号 要求(可根据实际情况加以扩充和修改): 识别保留字:if、int、for、while、do、return、break、continue等等,单词种别码为1。 其他的标识符,单词种别码为2。 常数为无符号数,单词种别码为3。 运算符包括:+、-、*、/、=、>、=、<=、!= ;单词种别码为4。 分隔符包括: “,”“;”“(”“)”“{”“}”等等, 单词种别码为5。 (四) 程序思路(仅供参考): 0. 定义部分:定义常量、变量、数据结构。 1. 初始化:从文件将源程序输入到字符缓冲区中。 2. 取单词前:去掉多余空白。调用过程GETNB(); 3. 提取字符组成单词,利用课本P97图4.5转换图构造单词扫描过程SCAN(),需要根据实际情况加以修改。 4. 判断单词的种别码,调用过程LOOKUP(); 5. 显示(导出)结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一马途追

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值