c语言实现pl0词法分析器

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

using namespace std;
char stayWord[16][15] = { “const”,“var”,“odd”,“procedure”,“begin”,“end”,“if”,“then”,“call”,“while”,“do”,“read”};

bool isNumber(char ch);
bool isCase(char ch);
bool isCaculationSymbol(char ch);
bool isBandSymbol(char ch);
int isStayWord(char* str);
void getInputStreamFromFile(char* fileName, char* str);
void calulationString(char* str);
void bandString(char* str);
void anal(char* InputFileName, char* str);

int main()
{
char s[100000], inputfile[100] = “a.txt”;
anal(inputfile, s);
return 0;
}

bool isNumber(char ch) {
if (ch >= ‘0’ && ch <= ‘9’) return true;
return false;
}

bool isCase(char ch)
{
if ((ch >= ‘a’ && ch <= ‘z’) || (ch >= ‘A’ && ch <= ‘Z’))
return true;
return false;
}

bool isCaculationSymbol(char ch)
{
if (ch == ‘+’ || ch == ‘-’ || ch == ‘/’ || ch == ‘>’ || ch == ‘<’ || ch == ‘=’ || ch == ‘#’ || ch == ‘:’)
return true;
return false;
}

bool isBandSymbol(char ch)
{
if (ch == ‘(’ || ch == ‘)’ || ch == ‘,’ || ch == ‘;’ || ch == ‘.’)
return true;
return false;
}

int isStayWord(char* str)
{
int i;
for (i = 0; i < 16; ++i) {
if (!strcmp(str, stayWord[i])) break;
}
return i;
}

void getInputStreamFromFile(char* fileName, char* str)
{
char ch;
int k = 0;
FILE* f;
f = fopen(fileName, “r”);
while ((ch = fgetc(f)) != EOF)
{
if (ch != ‘\n’)
str[k++] = ch;
else
str[k++] = ’ ';
}
str[k] = ‘\0’;
fclose(f);
}

void calulationString(char* str)
{
int len = strlen(str);
int i;
for (i = 0; i < len; ++i)
{
if (str[i] == ‘+’||str[i] == ‘-’||str[i] == ‘*’||str[i] == ‘/’||str[i] == ‘=’)
printf(" %c 运算符\n",str[i]);
else if (str[i] == ‘:’) {
if (i + 1 < len && str[i + 1] == ‘=’) {
printf(" := 运算符\n");
i++;
}
else
printf(" %c 非法字符!\n", str[i]);
}
else if (str[i] == ‘#’) printf(" # 运算符\n");
else if (str[i] == ‘>’) {
if (i + 1 < len && str[i + 1] == ‘=’) {
printf(" >= 逻辑运算符\n");
i++;
}
else
printf(" > 逻辑运算符\n");
}
else if (str[i] == ‘<’) {
if (i + 1 < len && str[i + 1] == ‘=’) {
printf(" <= 逻辑运算符\n");
i++;
}
else
printf(" < 逻辑运算符\n");;
}
}
}

void bandString(char* str)
{
int len, i;
len = strlen(str);
for (i = 0; i < len; ++i)
printf(" %c 界符\n",str[i]);

}
void anal(char* InputFileName, char* str)
{
getInputStreamFromFile(InputFileName, str);
int len = strlen(str);
int i, j, len1, len2, k, t, re;
char str1[100], str2[100];
i = 0;
while (i < len)
{
j = 0;
while (str[i] == ’ ’ && i < len) ++i;
while (str[i] != ’ ’ && i < len) str1[j++] = str[i++];
str1[j] = ‘\0’;
len1 = strlen(str1);
k = 0;
while (k < len1)
{
if (isCase(str1[k]))
{
t = 0;
while ((!isCaculationSymbol(str1[k])) && (!isBandSymbol(str1[k])) && k < len1)
str2[t++] = str1[k++];
str2[t] = ‘\0’;
re = isStayWord(str2);

            if (re < 16)

            {
                printf("  %s  基本字\n", stayWord[re]);
                strcpy(str2, "");
                t = 0;
            }
            else
            {
                printf("  %s  标识符\n", str2);
                strcpy(str2, "");
                t = 0;
            }
        }
        else if (isNumber(str1[k]))
        {
            while (isNumber(str1[k]) && k < len1)
                str2[t++] = str1[k++];
            str2[t] = '\0';
            printf("  %s  数字\n", str2);
            strcpy(str2, "");
            t = 0;
        }
        else if (isCaculationSymbol(str1[k])) {
            while (isCaculationSymbol(str1[k]) && k < len1)
                str2[t++] = str1[k++];
            str2[t] = '\0';
            calulationString(str2);
            strcpy(str2, "");
            t = 0;
        }
        else if (isBandSymbol(str1[k]))
        {
            while (isBandSymbol(str1[k]) && k < len1)
                str2[t++] = str1[k++];;
            str2[t] = '\0';
            bandString(str2);
            strcpy(str2, "");
            t = 0;
        }
        else {
            printf("  字符串无法识别!\n"); k++;
        }

    }
    strcpy(str2, "");
}
fclose(stdout);

}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值