简单的C语言词法分析器之源程序过滤注释及换行符等

1、首先将要过滤的.c文件读取出来。

int main()
{
    char resProject[10000];
    char token[20] = {0};
    int pProject = 0;
    FILE *fp,*fp1;
    cout<<"1111"<<endl;
    if((fp = fopen("E:\\bianyiyuanlishiyan\\sy1\\demo2.c","r")) == NULL)
    {
        cout<<"can't open this file"<<endl;
        exit(0);
    }
    resProject[pProject] = fgetc(fp);
    while(resProject[pProject] != '$')
    {
        pProject++;
        resProject[pProject]=fgetc(fp);
    }
    pProject++;
    resProject[pProject] = '\0';
    fclose(fp);
    cout<<resProject<<endl;
    filter(resProject,pProject);
    cout<<resProject<<endl;
}

2、过滤注释,有单行注释和多行注释之分。

void filter(char r[],int pProject)
{
    char tempstr[10000];
    int count = 0;
    for(int i = 0;i<=pProject;i++)
    {
        //单行注释,直到遇到回车换行
        if(r[i]=='/'&&r[i+1]=='/')
        {
            while(r[i]!='\n')
            {
                i++;
            }
        }
        //多行注释
        if(r[i]=='/'&&r[i+1]=='*')
        {
            i+=2;
            while(r[i]!='*'||r[i+1]!='/')
            {
                i++;
                if(r[i]=='$')
                {
                    printf("error");
                    exit(0);
                }
            }
            i += 2;
        }
        if (r[i] != '\n'&&r[i] != '\t'&&r[i] != '\v'&&r[i] != '\r')
        {//若出现无用字符,则过滤;否则加载
            tempstr[count++] = r[i];
        }
    }
    tempstr[count] = '\0';
    strcpy(r, tempstr);
}

运行结果:

 

完整代码:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "iostream"
using namespace std;
void filter(char r[],int pProject)
{
    char tempstr[10000];
    int count = 0;
    for(int i = 0;i<=pProject;i++)
    {
        //单行注释,直到遇到回车换行
        if(r[i]=='/'&&r[i+1]=='/')
        {
            while(r[i]!='\n')
            {
                i++;
            }
        }
        //多行注释
        if(r[i]=='/'&&r[i+1]=='*')
        {
            i+=2;
            while(r[i]!='*'||r[i+1]!='/')
            {
                i++;
                if(r[i]=='$')
                {
                    printf("error");
                    exit(0);
                }
            }
            i += 2;
        }
        if (r[i] != '\n'&&r[i] != '\t'&&r[i] != '\v'&&r[i] != '\r')
        {//若出现无用字符,则过滤;否则加载
            tempstr[count++] = r[i];
        }
    }
    tempstr[count] = '\0';
    strcpy(r, tempstr);
}
int main()
{
    char resProject[10000];
    char token[20] = {0};
    int pProject = 0;
    FILE *fp,*fp1;
    if((fp = fopen("E:\\bianyiyuanlishiyan\\sy1\\demo2.txt","r")) == NULL)
    {
        cout<<"can't open this file"<<endl;
        exit(0);
    }
    resProject[pProject] = fgetc(fp);
    while(resProject[pProject] != '$')
    {
        pProject++;
        resProject[pProject]=fgetc(fp);
    }
    pProject++;
    resProject[pProject] = '\0';
    fclose(fp);
    cout<<resProject<<endl;
    filter(resProject,pProject);
    cout<<resProject<<endl;
}







.c文件代码

#include<stdio.h>
int main()
{
    int i = 0;//定义一个i
    if(i==0)
    {
        /*输出i
        123*/
        printf("i:",i);
    }
    return 0;
}$

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章