【编译原理】实验1.词法分析
来源:互联网 发布:系统温度监控软件 编辑:程序博客网 时间:2024/06/05 06:08
实验1. 词法分析
一、 实验目的
调试一个词法分析程序,加深对词法分析原理的理解。
二、 实验要求
1、 待分析的简单语言的词法
(1) 关键字:
begin if then while do end
所有关键字都是小写。
(2) 运算符和界符:
:= + – * / < <= <> > >= = ; ( ) #
(3) 其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:
ID=letter(letter| digit)*
NUM=digit digit *
(4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。
2、 各种单词符号对应的种别码
单词符号 | 种别码 | 单词符号 | 种别码 |
begin | 1 | : | 17 |
if | 2 | := | 18 |
then | 3 | < | 20 |
while | 4 | <> | 21 |
do | 5 | <= | 22 |
end | 6 | > | 23 |
letter(letter| digit)* | 10 | >= | 24 |
digit digit * | 11 | = | 25 |
- | 13 | ; | 26 |
+ | 14 | ) | 27 |
* | 15 | ( | 28 |
/ | 16 | # | 0 |
3、 词法分析程序的功能
输入:所给文法的源程序字符串。
输出:二元组(syn,token或sum)构成的序列。
其中:syn为单词种别码;
token为存放的单词自身字符串;
sum为整型常数。
三、结果验证
给定源程序 begin x:=9; if x>0 then x:=2*x+1/3; end#
begin__x:=9;_if_x>0__then__x:=2*x+1/3;end#
输出结果。
源代码
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
char prog[80],token[8];
char ch;
int syn,p,m=0,n,sum=0; //p是缓冲区prog的指针,m是token的指针
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner()
{
for(n=0;n<8;n++) token[n]=NULL;
ch=prog[p++];
while(ch==' ') //空字符
ch=prog[p++];//执行语句1;
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'/*判断ch是字母字符的条件*/))
{
m=0;
while((ch>='A'&&ch<='Z')/*加入判断语句*/||(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'))
{
token[m++]=ch;
ch=prog[p++];
}
token[m++]='\0';
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0/*加入判断条件*/)
{
syn=n+1;
break;
}
}
else
if(ch>='0'&&ch<='9')
{
sum=0;
while(ch>='0'&&ch<='9'/*加入判断条件*/)
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;//执行语句2;
}
else
{
switch(ch)
{
case'>':
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=24;
token[m++]=ch;
}
else
{
syn=23;
p--;
}
break;
case'<':
//补充程序;
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='>')
{
syn=21;
token[m++]=ch;
}
else if(ch='=')
{
syn=22;
token[m++]=ch;
}
else
{
syn=20;
p--;
}
case':':
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=18;
token[m++]=ch;
}
else
{
syn=17;
p--;
}
break;
case'-':
syn=13;
token[0]=ch;
break;
case'+':
syn=14;
token[0]=ch;
break;
case'*':
syn=15;
token[0]=ch;
break;
case'/':
syn=16;
token[0]=ch;
break;
case';':
syn=26;
token[0]=ch;
break;
case')':
syn=27;
token[0]=ch;
break;
case'(':
syn=28;
token[0]=ch;
break;
case'#':
syn=0;
token[0]=ch;
break;
default:
syn=-1;
}
}
}
void main()
{
p=0;
cout<<"\n please input string: \n";
//do
//{
// cin>>ch;
// prog[p++]=ch;
//}while(ch!='#');
//p=0;
gets(prog);
do
{
scaner();
switch(syn)
{
case 11:
cout<<"(11,"<<sum<<")";
break;
case -1:
cout<<"error!";
break;
default:
cout<<"("<<syn<<","<<token<<")";
}
}while (syn!=0);
cin>>p;
}
下载:http://good.gd/1996819.htm
Destory Code:sb360
- 【编译原理】实验1.词法分析
- 编译原理实验----词法分析
- 编译原理实验---词法分析
- 编译原理--实验一 词法分析
- 编译原理实验 之 词法分析
- 编译原理实验改进版(词法分析)
- 编译原理实验1-词法分析
- 编译原理课程实验--词法分析
- 编译原理实验一 词法分析程序
- 编译原理实验之词法分析
- 哈工大编译原理实验一词法分析
- 编译原理 词法分析
- 编译原理词法分析
- 编译原理 词法分析
- 编译原理词法分析
- 编译原理词法分析
- 编译原理词法分析
- 编译原理 词法分析
- 如果你想学好C#,请保持一下良好心态!!
- [转载]PHP页面之间传递参数的四种方式
- Viual Studio 2010 Directx开发环境配置
- [C++]三维图形旋转-矩阵
- PL/0语言功能扩展[PASCAL VERSION]
- 【编译原理】实验1.词法分析
- wp7实现定时刷新(计时器)
- Windows Phone 7 Bugs
- C# listview实现排序[存档]
- ANTLR实现简单计算器[C#]
- WP7-WebService-SQL Server-IIS综合应用Demo
- C#问题集锦
- 互联网时代如何保存笔记
- Android开发--一些错误集合