c语言词法分析器


#include <iostream>
#include<string>
#include <stdio.h>
using namespace std;

const string KeyWord[12] = { "main","int","char","if","else","for","while","return","void","STRING","ID","INT" };  
// There are many things you can add to this, this is just a simple simulation

int syn;
string jibo;       

int sum; 

int i = 0;

int skip = 1;     


bool IsLetter(char ch);   

bool IsDigit(char ch);   

void scan(string s);    

int main()
{
    
    string a = "";
    printf("\n Please enter a string (the conversion is over, the conversion is not recognized) :");
    getline(cin, a);

    printf("\nOutput (type, letter or number) :\n");

    do
    {
        scan(a);
        switch (syn)
        {
        case -1:
            printf("error:There is no end character or invalid characters");
            syn = 0;
            break;
        case -2:      // Spaces are skipped
            break;
        default:
            if (syn != 0)
            {
                if (1<= syn && 22 >= syn)//1 to 22 delimiters, 23 numbers,24 identifiers,25 keywords,26 to 31 operators 
                {
                    cout << "(分界符," << jibo << ")" << endl;
                }
                else if (syn == 23)
                {
                    cout << "(字面量," << sum << ")" << endl;
                }
                else if (syn == 24)
                {
                    cout << "(标识符," << jibo << ")" << endl;
                }
                else if (syn == 25)
                {
                    cout << "(关键字," << jibo << ")" << endl;
                }
            }

        }

    } while (syn != 0);

}

bool IsLetter(char ch)  //Whether it is a letter
{
    if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
        return true;
    else
        return false;

}

bool IsDigit(char ch)  //Whether it is a number
{
    if (ch >= '0' && ch <= '9')
        return true;
    else
        return false;

}

void scan(string a)    
{
    if (a[i] == ' ')//space
    {
        syn = -2;
        i++;
    }
    else
    {
        jibo = "";

        
        if (IsDigit(a[i]))//number
        {
            jibo = "";
            sum = 0;
            while (IsDigit(a[i])) {
                sum = sum * 10 + (a[i] - '0');
                i++; 
                syn = 23;   
            }
                 
        }

        else if (IsLetter(a[i]))//string
        {

            jibo = "";
            while (IsDigit(a[i]) || IsLetter(a[i])) {
                jibo += a[i];
                i++;
            }
                syn = 24;

            
            for (int j = 0; j < 12; j++)//keywords
            {
                if (jibo == KeyWord[j])
                {
                    syn = 25;   
                    break;
                }
            }
        }

        // Judge as sign
        else {                        //operator
            jibo = "";
            switch (a[i]) {
            case'=':
                syn = 30;
                i++;
                jibo = "=";
                if (a[i] == '=') {
                    syn = 6;
                    i++;
                    jibo = "==";
                }
                break;

            case'+':syn = 29;            
                    i++;
                    jibo = "+";
                    break;
                
            case'-':
                syn = 28;
                i++;
                jibo = "-";
                break;

            case'*':
                syn = 27;
                i++;
                jibo = "*";
                break;

            case'/':
                syn = 26;
                i++;
                jibo = "/";
                break;
            case'%':
                syn = 31;
                i++;
                jibo = "%";
                break;
            case'&':
                syn = 32;
                i++;
                jibo = "&";
                break;

            case'(':
                syn = 11;
                i++;
                jibo = "(";
                break;

            case')':
                syn = 12;
                i++;
                jibo = ")";
                break;

            case'[':
                syn = 13;
                i++;
                jibo = "[";
                break;

            case']':
                syn = 14;
                i++;
                jibo = "]";
                break;

            case'{':
                syn = 15;
                i++;
                jibo = "{";
                break;

            case'}':
                syn = 16;
                i++;
                jibo = "}";
                break;

            case',':
                syn = 17;
                i++;
                jibo = ",";
                break;

            case':':
                syn = 18;
                i++;
                jibo = ":";
                break;

            case';':
                syn = 19;
                i++;
                jibo = ";";
                break;

            case'>':
                syn = 20;
                i++;
                jibo = ">";
                if (a[i] == '=')
                {

                    i++;
                    jibo = ">=";
                }
                break;

            case'<':
                syn = 21;
                i++;
                jibo = "<";
                if (a[i] == '=')
                {

                    i++;
                    jibo = "<=";
                }
                break;

            case'!':
                syn = 22;
                i++;
                if (a[i] == '=')
                {
                    syn = 1;
                    i++;
                    jibo = "!=";
                }
                break;

            case '"':
                syn = 2;
                jibo += a[i];
                i++;
                break;
            case '#':
                syn=3;
                jibo='#';
                i++;
                break;
            
            default:
                syn = -1;
                break;
            }
        }
    }

}
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值