0929作业

1词法分析器的功能 1)输入源程序 2)从左至右地对源程序进行扫描,按照语言的词法规则识别各类单词,并产生相应单词的属性字

2.


单词符号


种别码


单词符号


种别码


begin


1


:


17


if


2


:=


18


then


3


<


20


while


4


<=


21


do


5


<>


22


end


6


>


23


l(l|d)*


10


>=


24


dd*


11


=


25


+


13


;


26


-


14


(


27


*


15


)


28


/


16


#


0

3.用文法描述词法规则

<字母> A a|b|c|……y|z

<数字> 
A→1|2|3|4|5|6|7|8|9
S→A|SA|SA0 
<整数常数>
A→1|2|3|4|5|6|7|8|9
S→A|SA|SA0 
<标识符>
A→a|b|c|……y|z
B→0|1|2|3|4|5|6|7|8|9
S→A|SB
<关键字>
S→if|else|while|do|for|int|char|……
<运算符>
S→+|-|x|/|=|#|<|>|<=|>=|:=
<界符>
S→(|)|,|;|.

#include <stdio.h>
#include <string.h>  

char prog[80],token[8],ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};  

void scaner(void);  

main()
{
    p=0;
    printf("\n please input a string(end with ‘#‘):\n");  

    do{
            scanf("%c",&ch);
            prog[p++]=ch;
    }while(ch!=‘#‘);  

    p=0;
    do{
            scaner();
            switch(syn)
            {
                case 11:
                    printf("( %-10d%5d )\n",sum,syn);
                break;  

                case -1:
                    printf("you have input a wrong string\n");
                    //getch();
                    return 0;
                break;  

                default:
                printf("( %-10s%5d )\n",token,syn);
                break;
            }
        }while(syn!=0);
    //getch();
    return 0;
 }  

void scaner(void)
{
    sum=0;  

    for(m=0;m<8;m++)
        token[m++]= NULL;  

        ch=prog[p++];
        m=0;  

    while((ch==‘ ‘)||(ch==‘\n‘))
        ch=prog[p++];  

    if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘)))
     {
        while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘)))
        {
            token[m++]=ch;
            ch=prog[p++];
        }  

        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‘))
     {
        while((ch>=‘0‘)&&(ch<=‘9‘))
        {
            sum=sum*10+ch-‘0‘;
            ch=prog[p++];
        }
        p--;
        syn=11;
    }
    else
    {
        switch(ch)
        {
        case ‘<‘:
            token[m++]=ch;
            ch=prog[p++];
            if(ch==‘=‘)
            {
                syn=22;
                token[m++]=ch;
            }
            else
            {
                syn=20;
                p--;
            }
        break;  

        case ‘>‘:
            token[m++]=ch;
            ch=prog[p++];
            if(ch==‘=‘)
            {
                syn=24;
                token[m++]=ch;
            }
            else
            {
                syn=23;
                p--;
            }
        break;  

        case ‘+‘:
            token[m++]=ch;
            ch=prog[p++];
            if(ch==‘+‘)
            {
                syn=17;
                token[m++]=ch;
            }
            else
            {
                syn=13;
                p--;
            }
        break;  

        case ‘-‘:
            token[m++]=ch;
            ch=prog[p++];
            if(ch==‘-‘)
            {
                syn=29;
                token[m++]=ch;
            }
            else
            {
                syn=14;
                p--;
            }
        break;  

        case ‘!‘:
            ch=prog[p++];
            if(ch==‘=‘)
            {
                syn=21;
                token[m++]=ch;
            }
            else
            {
                syn=31;
                p--;
            }
        break;  

        case ‘=‘:
            token[m++]=ch;
            ch=prog[p++];
            if(ch==‘=‘)
            {
                syn=25;
                token[m++]=ch;
            }
            else
            {
                syn=18;
                p--;
            }
        break;  

        case ‘*‘:
            syn=15;
            token[m++]=ch;
        break;  

        case ‘/‘:
            syn=16;
            token[m++]=ch;
        break;  

        case ‘(‘:
            syn=27;
            token[m++]=ch;
        break;  

        case ‘)‘:
            syn=28;
            token[m++]=ch;
        break;  

        case ‘{‘:
            syn=5;
            token[m++]=ch;
        break;  

        case ‘}‘:
            syn=6;
            token[m++]=ch;
        break;  

        case ‘;‘:
            syn=26;
            token[m++]=ch;
        break;  

        case ‘\"‘:
            syn=30;
            token[m++]=ch;
        break;  

        case ‘#‘:
            syn=0;
            token[m++]=ch;
        break;  

        case ‘:‘:
            syn=17;
            token[m++]=ch;
        break;  

        default:
            syn=-1;
        break;
        }
    }
        token[m++]=‘\0‘;
}
时间: 2024-08-09 14:48:46

0929作业的相关文章

软件工程——第二次作业(2)

施工中-- 作业要求:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/922 项目要求是编写出一个拥有"词频统计"功能的小程序,作为一个小程序,若只是实现基本的词频统计功能,其实并不是很难.但是,如果再附加一些需求和功能的话就会让我感到有点难度了,更何况为了以后课程的要求,我选择使用Visual Studio 2015编译器和C#语言这两种从未学过的工具,在4-5天之内共10个小时左右(预计,但是实际上确实是花了更多时间

2017282110285--第一次个人作业

第一部分:结缘计算机 1.你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 其实我从高一就开始接触编程了,在高中我搞了两年的算法竞赛,算是有一点算法基础(捂脸,其实实力弱得一批),也是在那个时候开始爱上了编程.因此在高考结束后就报了信息安全专业,哪怕那时候父母不是很支持我报跟计算机相关的专业.我认为我的起步条件会比一般的零基础的萌新稍微好那么一点点,但也就仅限于此了,毕竟有天赋的人比比皆是,他们只是缺少一个契机罢了,入门之后分分钟起飞的也是一大把,更不用说那些大牛博主了,他们的程序员

python学习:程序控制结构·作业20141219

Python学习:程序控制结构 20141219 编程环境: windows 7 x64 python 2.7.6 题目: 1 编写程序,完成下列题目(1分) 题目内容: 如果列出10以内自然数中3或5的倍数,则包括3,5,6,9.那么这些数字的和为23.要求计算得出任意正整数n以内中3或5的倍数的自然数之和. 输入格式: 一个正整数n. 输出格式: n以内中3或5的倍数的自然数之和. 输入样例: 10 输出样例: 23 时间限制:500ms内存限制:32000kb n = int(raw_in

团队编程项目作业

团队名称: 简单 队长 学号:2015035107224 姓名:张志鹏 成员 学号:2015035107071 姓名:邱阳阳 学号:2015035107044 姓名:刘孝东 学号:2015035107007 姓名:孙弘原 学号:2015035107005 姓名:刘文帅 学号:2015035107009 姓名:杨琳 团队编程项目作业名称:爬取豆瓣电影TOP250 选择该团队编程项目原因:感觉项目有意思

团队项目编程作业

团队名称: 简单 队长 学号:2015035107224 姓名:张志鹏 成员 学号:2015035107071 姓名:邱阳阳 学号:2015035107044 姓名:刘孝东 学号:2015035107007 姓名:孙弘原 学号:2015035107005 姓名:刘文帅 学号:2015035107009 姓名:杨琳 团队编程项目作业名称:爬取豆瓣电影TOP250 选择该团队编程项目原因:我爱学习

团队作业八——第二次团队冲刺(Beta版本)第6天

团队作业八--第二次团队冲刺(Beta版本)第5天 一.每个人的工作 (1) 昨天已完成的工作 简单模式逻辑代码涉及与相关功能的具体实现 (2) 今天计划完成的工作 修改完善注册登录内容界面,编辑错题文件写入. (3) 工作中遇到的困难 今天花了较多时间在完善登录注册界面上,这让我们比较担心,如果每天都花很多时间在解决之前的问题,当天的任务又做不好,会不会赶不上进度.如果每天都不能正常完美的完成每天任务,那冲刺最后一天结束的时候,又哪里再有一个明天给我们完善代码.且今天还遇到了写入SD存储卡文件

第四周作业(汇总)

本周作业: 1.对四则运算软件需求的获取方式进行实践,例如使用调查问卷访问相关关系人等. 答: 本次是借助“问卷星”网站来发布问卷进行调查的.问卷地址:https://sojump.com/jq/9942880.aspx 本次问卷针对学生.家长和老师三个对象进行调查,对 四则软件进行需求分析.问卷调查结束后,问卷星还提供数据分析服务. 2.采用四象限法将你小组的四则运算软件的需求功能进行分类.阐述其优势与不足. 3.尝试把四则运算软件需求进行分解,变为每个小组成员可执行的积压工作项,分配这些工作

个人作业-Week3:代码复审

软件工程师的成长 我在上大学之前,对于软件工程师之类并无概念,并且高初中的电脑课也从未提及过写代码之类的东西,更多的都是一些教一些办公软件的使用(笑,明明电脑课总是因为老师“有事”变成其他课,根本就没上过几节吧),来到大学后得知一些同学高中就开始搞各种竞赛后,我感到十分惊讶,什么,从小热爱学习XX,一路坚持,最终成为XX大师的人小说以外真的有啊.大学之后的课余时间更是鲜有与软件工程相挂钩的事情,用一句话概括,就是过着这些博主批判对象的生活,十分尴尬.选这个课就是觉得应该做出些改变了,然而在第一次

z作业二总结

这是我的第二次作业,之前在课上所学的我发现已经忘得差不多了,这次的作业让我做的非常累,感觉整个人生都不太好了. 作业中的知识点:int(整型) float(单精度) double(双精度) char(字符型) 任何变量都必须先定义后使用 变量=表达式注:左边必须是单个变量 printf—格式控制字符 普通字符:原样输出. 格式控制说明:按指定的格式输出数据,与数据类型有关 >:大于 <:小于 <=,>=小于等于,大于等于 ==:等于 !=:不等于 实验中遇到的困难:知识点基本上都忘