• 大小: 205KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-07-28
  • 语言: 其他
  • 标签: 语法分析  

资源简介

语法分析和词法分析,编译技术原理实验报告完整代码。

资源截图

代码片段和文件信息

#include “stdio.h“  
#include “string.h“  
char prog[100]token[8]ch;//prog[100],用来存储要处理的对象,token用来与关键字比较,ch用来存储一个字符  
char *rwtab[6]={“begin““if““then““while““do““end“};//关键字表  
int synpmnsum;  
/*syn是种别码,p为prog数组的指针,m为token数组的指针,n为rwtab数组的指针,sum为词法分析器里的数字数值大小*/  
int flag;//flag与判断是否end有关  
  
void factor(void);//因式 factor  
void expression(void);//表达式 expression  
void yucu(void);  
void term(void);//项 term  
void statement(void);// 语句 statement  
void parser(void);  
void scaner(void);//扫描器  
  
  
int main(void)  
{  
    p=flag=0;  
    printf(“\nplease input a string (end with ‘#‘): \n“);  
  
    /*从命令行读取要处理的对象,并存储在prog[]数组中*/  
    do  
    {  
        scanf(“%c“&ch);  
        //printf(“\n input %c now\n“ch);  
        prog[p++]=ch;  
    }while(ch!=‘#‘);  
  
    p=0;  
    scaner();//主要完成赋值种别码等词法分析功能  
    parser();//调用各种递归子程序,完成语法分析的过程  
    //getch();  
}  
  
/*调用各种递归子程序,完成语法分析的过程*/  
void parser(void)  
{  
    if(syn==1)//begin  
    {  
        scaner();       /*读下一个单词符号*/  
        yucu();         /*调用yucu()函数;*/  
  
        if(syn==6)//end  
        {  
            scaner();  
            if((syn==0)&&(flag==0))//出现#且flag=0  
            printf(“success!\n“);  
        }  
        else  
        {  
            if(flag!=1) printf(“the string haven‘t got a ‘end‘!\n“);//flag来判断是否end  
            flag=1;  
        }  
    }  
    else  
    {  
        printf(“haven‘t got a ‘begin‘!\n“);  
        flag=1;  
    }  
  
    return;  
}  
  
void yucu(void)  
{  
    statement();         /*调用函数statement();*/  
  
    while(syn==26)//分号  
    {  
        scaner();          /*读下一个单词符号*/  
        if(syn!=6)  
            statement();         /*调用函数statement();*/  
    }  
  
    return;  
}  
  
void statement(void)  
{  
    if(syn==10)  
    {  
        scaner();        /*读下一个单词符号*/  
        if(syn==18)  
        {  
            scaner();      /*读下一个单词符号*/  
            expression();      /*调用函数expression();*/  
        }  
        else  
        {  
            printf(“the sing ‘:=‘ is wrong!\n“);  
            flag=1;  
        }  
    }  
    else  
    {  
        printf(“wrong sentence!\n“);  
        flag=1;  
    }  
  
    return;  
}  
  
void expression(void)  
{  
    term();  
  
    while((syn==13)||(syn==14))  
    {  
        scaner();             /*读下一个单词符号*/  
        term();               /*调用函数term();*/  
    }  
  
    return;  
}  
  
void term(void)  
{  
    factor();  
  
    while((syn==15)||(syn==16))  
    {  
        scaner();             /*读下一个单词符号*/  
        factor();              /*调用函数factor(); */  
    }  
  
    return;  
}  
  
void factor(void)//因式处理函数  
{  
    if((syn==10)||(syn==11))//标识符,数字  
    {  
        scaner();  
    }  
    else if(syn==27)//开头是左括号(  
    {  
        scaner();           /*读下一个单词符号*/  
        expression();        /*调

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-05-01 22:49  语法分析\
     目录           0  2018-05-01 11:20  语法分析\Debug\
     文件      188501  2018-05-01 20:19  语法分析\Debug\YUFA1613001007.exe
     文件      185956  2018-05-01 20:19  语法分析\Debug\YUFA1613001007.ilk
     文件       14237  2018-05-01 20:19  语法分析\Debug\YUFA1613001007.obj
     文件      213596  2018-05-01 11:20  语法分析\Debug\YUFA1613001007.pch
     文件      369664  2018-05-01 11:20  语法分析\Debug\YUFA1613001007.pdb
     文件       33792  2018-05-01 22:49  语法分析\Debug\vc60.idb
     文件       45056  2018-05-01 11:20  语法分析\Debug\vc60.pdb
     文件        6567  2018-05-01 11:08  语法分析\YUFA1613001007.cpp
     文件        3497  2018-05-01 20:19  语法分析\YUFA1613001007.dsp
     文件         553  2018-05-01 22:49  语法分析\YUFA1613001007.dsw
     文件       41984  2018-05-01 22:49  语法分析\YUFA1613001007.ncb
     文件       48640  2018-05-01 22:49  语法分析\YUFA1613001007.opt
     文件         262  2018-05-01 22:49  语法分析\YUFA1613001007.plg
     文件       14444  2018-05-01 11:13  语法分析\success截图.PNG

评论

共有 条评论