词法分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一词法分析器
一.实验目的:
编译一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。

二.实验要求:利用C语言编制递归下降分析程序,并对简单语言进行语法分析。

(1)实验要求说明:输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。

三.算法思想
设计该词法分析器的过程中虽然没有实际将所有的状态转移表建立出来,但是所用的思想是根据状态转移表实现对单词的识别。

首先构造一个保留字表,然后,每输入一个字符就检测应该进入什么状态,并将该字符连接到d串后继续输入,如此循环,最后根据所在的接受状态以及保留字表识别单词。

四.符号表:
记号种别码
begin 1
if 2
then 3
while 4
do 5
end 6
letter(letter|digit)* 10
digit digit* 11
+ 13
- 14
* 15
/ 16
: 17
:= 18
< 20
<> 21
<= 22
> 23
>= 24
= 25
; 26
( 27
) 28
# 29
程序源代码及测试用例:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Key_word "waiting for your expanding"
typedef struct
{
int typenum;
char * word;
}WORD;
char in[255];
char token[255]="";
int p_in;
int p_token;
char ch;
char * rwtab[]={"begin","if","then","while","do","end",Key_word}; WORD * scaner();
void main()
{
int over=1;
WORD * oneword=new WORD;
printf("Enter your words(end with #):");
scanf("%[^#]s",in);
while(over<1000 && over!=-1)
{
oneword=scaner();
if(oneword->typenum<1000)
printf("(%d,%s)",oneword->typenum,oneword->word);
over=oneword->typenum;
}
printf("\npress # to exit:");
scanf("%[^#]s",in);
}
char m_getch()
{
ch=in[p_in];
p_in=p_in+1;
return (ch);
}
void getbc()
{
while(ch==' '||ch==10)
{
ch=in[p_in];
p_in=p_in+1;
}
}
void concat()
{
token[p_token]=ch;
p_token=p_token+1;
token[p_token]='\0';
}
int letter()
{
if(ch>='a' && ch<='z' || ch>='A' && ch<='Z') return 1;
else
return 0;
}
int digit()
{
if(ch>='0' && ch<='9')
return 1;
else
return 0;
}
int reserve()
{
int i=0;
while(strcmp(rwtab[i],Key_word)) {
if(!strcmp(rwtab[i],token))
{
return i+1;
}
i=i+1;
}
return 10;
}
void retract()
{
p_in=p_in-1;
}
char * dtb()
{
return NULL;
}
WORD * scaner()
{
WORD * myword=new WORD;
myword->typenum=10;
myword->word="";
p_token=0;
m_getch();
getbc();
if(letter())
{
while(letter() || digit()) {
concat();
m_getch();
}
retract();
myword->typenum=reserve();
myword->word=token;
return (myword);
}
else if(digit()){
while(digit()){
concat();
m_getch();
}
retract();
myword->typenum=20;
myword->word=token;
return (myword);
}
else switch(ch){
case '=':
m_getch();
if(ch=='='){
myword->typenum=39;
myword->word="==";
return (myword);
}
retract();
myword->typenum=21;
myword->word="=";
return (myword);
break;
case '+':
myword->typenum=22;
myword->word="+";
return (myword);
break;
case '-':
myword->typenum=23;
myword->word="-";
return (myword);
break;
case '*':
myword->typenum=24;
myword->word="*";
return (myword);
break;
case '/':
myword->typenum=25;
myword->word="/";
return (myword); break;
case '(':
myword->typenum=26; myword->word="("; return (myword); break;
case ')':
myword->typenum=27; myword->word=")"; return (myword); break;
case '[':
myword->typenum=28; myword->word="["; return (myword); break;
case ']':
myword->typenum=29; myword->word="]"; return (myword); break;
case '{':
myword->typenum=30; myword->word="{"; return (myword); break;
case '}':
myword->typenum=31; myword->word="}"; return (myword); break;
case ',':
myword->typenum=32; myword->word=","; return (myword); break;
case ':': myword->typenum=33; myword->word=":"; return (myword);
case ';':
myword->typenum=34; myword->word=";";
return (myword);
break;
case '>':
m_getch();
if(ch=='='){
myword->typenum=37;
myword->word=">=";
return (myword);
}
retract();
myword->typenum=35; myword->word=">";
return (myword);
break;
case '<':
m_getch();
if(ch=='='){
myword->typenum=38;
myword->word="<=";
return (myword);
}
retract();
myword->typenum=36; myword->word="<";
return (myword);
break;
case '!':
m_getch();
if(ch=='='){
myword->typenum=40;
myword->word="!=";
return (myword);
}
retract();
myword->typenum=-1; myword->word="ERROR"; return (myword);
case '\0':
myword->typenum=1000;
myword->word="OVER";
return (myword);
break;
default:
myword->typenum=-1;
myword->word="ERROR";
return (myword);
}
}
实验心得:
此次实验让我了解了如何设计、编制并调试词法分析程序,并加深了我对词法分析器原理的理解;熟悉了直接构造词法分析器的方法和相关原理,并学会使用c语言直接编写词法分析器;同时更熟练的掌握用c语言编写程序,实现一定的实际功能。

相关文档
最新文档