资源简介

本资源是PL/0语言的语法分析程序(C语言版),外加输出语法树,每行附带注释,可读性强,下载下来配合.h文件即可编译

资源截图

代码片段和文件信息

/*
 * PL/0 complier program for win32 platform (implemented in C)
 *
 * The program has been test on Visual C++ 6.0 Visual C++.NET and
 * Visual C++.NET 2003 on Win98 WinNT Win2000 WinXP and Win2003
 *
 * 使用方法:
 * 运行后输入PL/0源程序文件?
 */

#include 
#include 
#include “pl0.h“
#include “string.h“

// 分割符,0表示0个‘--‘,1表示1个,以此类推
int Tree_level[500];
// 存单词
char* Tree[500]; 
// 数单个个数
int word_num = 0;

void Gen_grammerTree(){
int i=0; 
printf(“\nGrammer Tree\n“);
    for(i=0 ; i        switch (Tree_level[i])
    {
    case 0:
     printf(“%s\n“Tree[i]);
        break;
    case 1:
     printf(“--%s\n“Tree[i]);
        break;
    case 2:
        printf(“----%s\n“Tree[i]);
        break;
    case 3:
        printf(“------%s\n“Tree[i]);
        break;
    case 4:
        printf(“--------%s\n“Tree[i]);
        break;
    case 5:
        printf(“----------%s\n“Tree[i]);
        break;
    case 6:
        printf(“------------%s\n“Tree[i]);
        break;
    case 7:
        printf(“--------------%s\n“Tree[i]);
        break;
    case 8:
        printf(“----------------%s\n“Tree[i]);
        break;
    case 9:
        printf(“------------------%s\n“Tree[i]);
        break;
    case 10:
        printf(“--------------------%s\n“Tree[i]);
        break;
    case 11:
        printf(“----------------------%s\n“Tree[i]);
        break;
    case 12:
        printf(“------------------------%s\n“Tree[i]);
        break;
    case 13:
        printf(“--------------------------%s\n“Tree[i]);
        break;
    case 14:
        printf(“----------------------------%s\n“Tree[i]);
        break;
    case 15:
        printf(“------------------------------%s\n“Tree[i]);
        break;
    case 16:
        printf(“--------------------------------%s\n“Tree[i]);
        break;
    default:
     printf(“越界!!“Tree[i]);
        break;
    }
    }
}

int main()
{
    printf(“Input pl/0 file?   “);
    scanf(“%s“ fname);     /* 输入文件名 */

    // 打开一个文件 返回文件指针: FILE类型的指针变量 指向该文件
    fin = fopen(fname “r“);

    if (fin)
    {
        init();     /* 初始化 */

        err = 0;    // 计算已发现的错误个数
        // cc、ll: getch使用的计数器 cc表示当前字符
        // cx虚拟机代码指针 取值范围[0 cxmax-1]
        cc = cx = ll = 0;
        // 缓冲区中获取字符,getch 使用 初始化为一个空格
        ch = ‘ ‘;

        // 首次读一个字符 后面的在block里完成 其是递归程序
        if(-1 != getsym())
        {
            // 记录语法树
            int Grammer_level = 0;
            Tree_level[word_num] = Grammer_level;
            Tree[word_num] = “ <程序>“;
            word_num+=1;
            // 三个参数 1: 当前分程序所在层 2: 名字表当前尾指针 第三个就是标识了3种声明和6种语句的bool数组
            // 第四个参数,表示语法树层数
            if(-1 == block(0 0 Grammer_level+1))   /* 调用编译程序 */
            {
                fclose(fin);
      

评论

共有 条评论