语法分析程序

语法分析程序

#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(sizeof(Link));    //申请空间
    charhead->next=q;                           //初始化链表
    q->next=NULL;
    printf("请输入一个字符串:");
    do
    {
        scanf("%c",&n);
        if(n==‘\n‘)
            break;
        p=(Link *)malloc(sizeof(Link));
        p->data=n;                        //把输入的字符存入链表中
        p->next=NULL;
        q->next=p;
        q=p;
    }while(n!=‘\n‘);
    q=charhead->next;
    /*while(q!=NULL)
    {
        printf("%c",q->data);
        q=q->next;
    }*/
     printf("语法分析:\n");
    specialchar(charhead);
}

void specialchar(Link *charhead)
{
    Link *q,*p;
    int i;
    q=charhead->next;
    while(q!=NULL)
    {
    switch(q->data)
    {
    case ‘b‘:              //判断是否是标识符begin
    special[0]=q->data;    //一步一步存入数组
     q=q->next;
     if(q->data==‘e‘)
     {
        special[1]=q->data;
        q=q->next;
        if(q->data==‘g‘)
        {
            special[2]=q->data;
            q=q->next;
            if(q->data==‘i‘)
            {
                special[3]=q->data;
                q=q->next;
                if(q->data==‘n‘)
                {
                special[4]=q->data;
                printf("<标识符> ");
                for(i=0;i<5;i++)
                    printf("%c",special[i]);
                printf("\n");
                }
            }
        }
     }
     break;
    case ‘i‘:               //判断是否是标识符if
        special[0]=q->data;
        q=q->next;
        if(q->data==‘f‘)
        {
        special[1]=q->data;
        printf("<标识符> ");
        for(i=0;i<2;i++)
           printf("%c",special[i]);
        printf("\n");
        }
        break;
    case ‘t‘:
        special[0]=q->data;
        q=q->next;
        if(q->data==‘h‘)
        {
            special[1]=q->data;
            q=q->next;
            if(q->data==‘e‘)
            {
            special[2]=q->data;
            q=q->next;
            if(q->data==‘n‘)
            {
            special[3]=q->data;
            printf("<标识符> ");
            for(i=0;i<4;i++)
            printf("%c",special[i]);
            printf("\n");
            }
            }
        }
        break;
    case ‘w‘:
     special[0]=q->data;    //一步一步存入数组
     q=q->next;
     if(q->data==‘h‘)
     {
        special[1]=q->data;
        q=q->next;
        if(q->data==‘i‘)
        {
            special[2]=q->data;
            q=q->next;
            if(q->data==‘l‘)
            {
                special[3]=q->data;
                q=q->next;
                if(q->data==‘e‘)
                {
                special[4]=q->data;
                printf("<标识符> ");
                for(i=0;i<5;i++)
                    printf("%c",special[i]);
                printf("\n");
                }
            }
        }
     }
     break;
    case ‘d‘:
        special[0]=q->data;
        q=q->next;
        if(q->data==‘o‘)
        {
        special[1]=q->data;
        printf("<标识符> ");
        for(i=0;i<2;i++)
           printf("%c",special[i]);
        printf("\n");
        }
        if(q->data==‘d‘)
        {
         special[1]=q->data;
         q=q->next;
         if(q->data==‘*‘)
         {
         special[2]=q->data;
         printf("<标识符> ");
         for(i=0;i<3;i++)
            printf("%c",special[i]);
         printf("\n");
         }
        }
        break;
    case ‘e‘:
        special[0]=q->data;
        q=q->next;
        if(q->data==‘f‘)
        {
         special[1]=q->data;
         q=q->next;
         if(q->data==‘f‘)
         {
         special[2]=q->data;
         printf("<标识符> ");
         for(i=0;i<3;i++)
            printf("%c",special[i]);
         printf("\n");
         }
        }
        break;
    case ‘l‘:
     special[0]=q->data;    //一步一步存入数组
     q=q->next;
     if(q->data==‘(‘)
     {
        special[1]=q->data;
        q=q->next;
        if(q->data==‘l‘)
        {
            special[2]=q->data;
            q=q->next;
            if(q->data==‘|‘)
            {
                special[3]=q->data;
                q=q->next;
                if(q->data==‘d‘)
                {
                special[4]=q->data;
                q=q->next;
                if(q->data==‘)‘)
                {
                special[5]=q->data;
                q=q->next;
                if(q->data==‘*‘)
                {
                special[6]=q->data;
                printf("<标识符> ");
                for(i=0;i<7;i++)
                    printf("%c",special[i]);
                printf("\n");
                }
                }
                }
             }
        }
     }
       break;
    case ‘+‘:
        printf("<加号> %c",q->data);
        printf("\n");
        break;
    case ‘-‘:
        printf("<减号> %c",q->data);
        printf("\n");
        break;
    case ‘*‘:
        printf("<乘号> %c",q->data);
        printf("\n");
        break;
    case ‘/‘:
        printf("<标识符> %c",q->data);
        printf("\n");
        break;
    case ‘:‘:
        special[0]=q->data;
        q=q->next;
        if(q->data==‘=‘)
        {
        special[1]=q->data;
        printf("<赋值号> ");
        for(i=0;i<2;i++)
           printf("%c",special[i]);
        }
        else
            printf("<赋值号> %c",special[0]);
        printf("\n");
        break;
    case ‘<‘:
        special[0]=q->data;
        q=q->next;
        if(q->data==‘=‘)
        {
        special[1]=q->data;
        printf("<标识符> ");
        for(i=0;i<2;i++)
           printf("%c",special[i]);
        printf("\n");
        }
        else if(q->data==‘>‘)
        {
        special[1]=q->data;
        printf("<标识符> ");
        for(i=0;i<2;i++)
           printf("%c",special[i]);
        printf("\n");
        }
        else{
            printf("<小于号> ");
            printf("%c",special[0]);
            printf("\n");
        }
        break;
    case ‘>‘:
        special[0]=q->data;
        q=q->next;
        if(q->data==‘=‘)
        {
        special[1]=q->data;
        printf("<标识符> ");
        for(i=0;i<2;i++)
           printf("%c",special[i]);
        printf("\n");
        }
        else{
            printf("<大于号> ");
            printf("%c",special[0]);
            printf("\n");
        }
        break;
    case ‘=‘:
        printf("<赋值符> %c",q->data);
        printf("\n");
        break;
    case ‘;‘:
        printf("<分号> %c",q->data);
        printf("\n");
        break;
    case ‘(‘:
        printf("<左括号> %c",q->data);
        printf("\n");
        break;
    case ‘)‘:
        printf("<右括号> %c",q->data);
        printf("\n");
        break;
    case ‘#‘:
        printf("<井号> %c",q->data);
        printf("\n");
        break;

 }
 q=q->next;

  }
}
时间: 2024-10-13 16:07:18

语法分析程序的相关文章

编写语法分析程序

编写语法分析程序 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

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

实验三.语法分析程序实验 专业:商业软件   姓名:邹汉辉  学号: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<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]="

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

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

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

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

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

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

PL/0与Pascal-S编译器程序详细注释

学校编译课的作业之一,要求阅读两个较为简单的编译器的代码并做注释, 个人感觉是一次挺有意义的锻炼, 将自己的心得分享出来与一同在进步的同学们分享. 今后有时间再做进一步的更新和总结,其中可能有不少错误,也请各位大佬不吝指正. 代码可以通过使用Lazarus等pascal环境执行. 源码仓库:https://github.com/luxiaodou/PL-0-and-Pascal-S-complier-trans PL0编译器源码 PL0语言是Pascal的一个子集,编译器也比较简单,逐行注释 p