0916 语法分析程序

源程序:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define _KEY_WOED_END "waiting for your expanding"     //关键字结束标志
 
typedef struct
{
    int typenum;
    char * word;
}WORD;
 
char input[255];   //输入换缓冲区
 
char token[255]="";   //单词缓冲区
 
int p_input;        //输入换缓冲区指针
 
int p_token;        //单词缓冲区指针
 
char ch;           //当前所读的字符
 
char *rwtab[]={"begin","if","then","while","do","end",_KEY_WOED_END};        //C语言关键字
 
WORD * scaner();    //词法扫描函数,获得关键字
 
 
 
 
 
 
main()
{
    int over=1;
    WORD *oneword;
    oneword=(WORD *)malloc(sizeof(WORD));
    printf("请输入您的字符串(以#作为结束标志):");
    scanf("%[^#]s",input);                        //读入源程序字符串到缓冲区,以#结束,允许多行输入
    p_input=0;
    printf("您输入的字符串是:%s\n\n",input);
    while(over<1000&&over!=-1)
    {
        oneword=scaner();
        printf("(%d,%s)\n",oneword->typenum,oneword->word);
        over=oneword->typenum;
    }
    printf("\n\n备注:数字10代表所输入的不是关键词,只是普通词\n");
    printf("     数字20代表您输入的是数字\n");
    printf("     数字1000是结束标志\n\n");
 
}
 
 
//需要用到的自编函数参考实现
//从输入缓冲区读取一个字符到ch中
 
char m_getch(){
    ch=input[p_input];
    p_input=p_input+1;
    return (ch);
}
 
 
 
//去掉空白字符
void getbc()
{
    while(ch==‘ ‘||ch==10){
    ch=input[p_input];
    p_input=p_input+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;
    for(i=0;i<7;i++)
    {
        if(!strcmp(rwtab[i],token))
        {
            return i+1;
        }
        i=i+1;
    }
    return 10;
}
 
 
 
 
//回退一个字符
void retract()
{
    p_input=p_input-1;
}
 
 
 
 
WORD *scaner()
{
    WORD *myword;
    myword=(WORD *)malloc(sizeof(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);
            break;
        case ‘;‘:
            myword->typenum=34;
            myword->word=";";
            return(myword);
            break;
        case ‘>‘:
            myword->typenum=35;
            myword->word=">";
            return(myword);
            break;
        case ‘<‘:
            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);
            break;
        case ‘\0‘:
            myword->typenum=1000;
            myword->word="OVER";
            return(myword);
            break;
        default:
            myword->typenum=-1;
            myword->word="ERROR";
            return(myword);
            }
        }
    }

时间: 2024-10-26 18:35:10

0916 语法分析程序的相关文章

编写语法分析程序

编写语法分析程序 Note: Mr.JY的编译原理! 文法改造 1.文法 1) <program>→{<declaration_list><statement_list>} 2) <declaration_list>→<declaration_list><declaration_stat> | ε 3) <declaration_stat>→int ID; 4) <statement_list>→<sta

语法分析程序

语法分析程序 #include<stdio.h> #include <stdlib.h> typedef struct link //字符链表 { char data; struct link *next; }Link; char special[10]; void specialchar(Link *charhead); main() { char n; Link *charhead; //定义头结点 Link *p,*q; charhead=q=(Link *)malloc(s

实验三、语法分析程序实验

实验三.语法分析程序实验 专业:商业软件   姓名:邹汉辉  学号:201508030045 一. 实验目的 1.通过设计,编制,调试一个递归下降语法分析程序 2.实现对词法分析程序所提供的单词序列进行语法检查和结构的分析. 二. 实验内容和要求 输入:正规式 输出:判断该正规式是否正确. 三. 实验方法.步骤及结果测试     源程序名:递归下降分析程序.c 可执行程序名:递归下降分析程序.exe 原理分析及流程图 主要程序段及其解释: 1 #include<stdio.h> 2 #incl

吉首大学_编译原理实验题_基于预測方法的语法分析程序的设计【通过代码】

一.实验要求 实验二 基于预測方法的语法分析程序的设计 一.实验目的 了解预測分析器的基本构成及用自顶向下的预測法对表达式进行语法分析的方法,掌握预測语法分析程序的手工构造方法. 二.实验内容 1.了解编译程序的基于预測方法的语法分析过程. 2.依据预測分析原理设计一个基于预測方法的语法分析程序. 三.实验要求 对给定文法G[S]: S->AT       A->BU     T->+AT|$      U->*BU|$    B->(S)|m 当中,$表示空串. 1.推断上

用JAVA实现LL(1)文法语法分析程序

一个简单语法分析器的设计与实现 实验目的: 1.掌握语法分析的基本任务: 2.掌握语法分析器的工作流程: 3.能设计一个简单的语法分析器,并完成对指定句子的分析. 实验内容: 给定一个LL(1)文法,编制语法分析程序,输出其预测分析表,用LL(1)预测分析程序实现其分析过程并输出分析过程和分析结果. 主要实验内容: 求出预测分析表,需要求解此文法的select集:而select集是由first集和follow集求解出来的.所以一般是先求出first集,再求出follow集,再最后求出select

0916 词法分析程序

#include<stdio.h> #include<string.h> #define N 100 main() { int i=0; char a[N]; printf("Input(以#作为结束):\n"); gets(a); i=0; while(a[i]!='#') { switch(a[i]) { case '+': printf("(13,+)\n"); break; case '-': printf("(14,-)\

实验三、 递归下降分析程序实验

一.        实验目的     练习构造递归下降语法分析程序的方法,熟悉上下文无关文法的使用,加深对课堂教学的理解:提高语法分析方法的实践能力 二.        实验内容和要求 对于给定的文法G[E]               E->TE'              E'->+TE' | ε             T->FT'             T'->*F T'| ε             F->(E) | i 采用递归下降语法分析法编写语法分析程序,该

实验三、&#160;递归下降分析程序实验

实验三. 递归下降分析程序实验 专业 软件工程   姓名 麦振澎 学号 201506110162 一.        实验目的           通过设计,编制,调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构的分析. 二.        实验内容和要求 输入:源程序字符串 输出:正确或者错误 三.        实验方法.步骤及结果测试             1.      源程序名: 递归下降语法分析程序.c       2.      原理分析及流程图

程序猿菜鸟必备——作为独立开发人员怎样系统的学习编程

接触一个行业,前期最好来一个系统的学习,有完整的框架一点一点的把基础吃透,不能左一耙子,右一锄头.以我的从业经验给大家分享怎样系统的学习编程开发,刚入坑的程序猿菜鸟注意了,迅速占据高地.迅速收藏了. 整体大致分为下面几类: A.教材上的知识 这部分内容来自计算机专业的课程教材.也有可能会涉及一部分来自其它相关专业或者相关课程的内容. B.编程语言 每个程序猿仅仅有在会使用一门语言的情况下才有可能从事开发工作,所以学习并掌握一门语言是最低要求了. C.SDK 光有一门语言是不够的,从事不论什么实际