欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

词法分析程序

程序员文章站 2022-06-22 19:33:42
Input输入一个小C语言源程序,源程序长度不超过2000个字符,保证输入合法。Output按照源程序中单词出现顺序输出,输出二元组形式的单词串。(单词种类,单词值)单词一共5个种类:关键字:用keyword表示自定义标识符:用identifier表示整数:用integer表示界符:用boundary表示运算符:用operator表示每种单词值用该单词的符号串表示。#include #include using name...

Input
输入一个小C语言源程序,源程序长度不超过2000个字符,保证输入合法。
Output
按照源程序中单词出现顺序输出,输出二元组形式的单词串。

(单词种类,单词值)

单词一共5个种类:

关键字:用keyword表示
自定义标识符:用identifier表示
整数:用integer表示
界符:用boundary表示
运算符:用operator表示

每种单词值用该单词的符号串表示。

#include <iostream>
#include <string>
using namespace std;

void judge(string s)
{
    if(s[0]>='0'&&s[0]<='9') //开头是数字肯定就为数字
    {
        cout<<"(integer,"<<s<<")"<<endl;
    }
    else if(s=="main"||s=="if"||s=="else"||s=="for"||s=="while"||s=="int")
    {
        cout<<"(keyword,"<<s<<")"<<endl;
    }
    else
    {
        cout<<"(identifier,"<<s<<")"<<endl;
    }
}
void lexical_analysis()
{
    string s;
    while(cin>>s)
    {
        int len=s.length();
        string temp="";
        for(int i=0; i<len; i++)
        {

            if(s[i] == '=' || s[i] == '+' || s[i] == '-'||s[i] == '*'
                    || s[i] == '/' || s[i] == '<' || s[i] == '>' || s[i] == '!')
            {
                if(temp.length())
                {
                    judge(temp);
                }
                temp="";
                if(i+1<len&&s[i+1]=='=')
                {
                    cout<<"(operator,"<<s[i]<<s[i+1]<<")"<<endl;
                    i++;
                }
                else
                {
                    cout<<"(operator,"<<s[i]<<")"<<endl;
                }
            }

            else if(s[i] == '(' || s[i] == ')' || s[i] == '{'||s[i] == '}'
                    || s[i] == ',' || s[i] ==';')
            {
                if(temp.length())
                {
                    judge(temp);
                }
                temp="";
                cout<<"(boundary,"<<s[i]<<")"<<endl;
            }

            else
            {
                temp=temp+s[i];
            }
        }
        if(temp.length())
        {
            judge(temp);
        }

    }
}
int main()
{
    lexical_analysis();

    return 0;

}

本文地址:https://blog.csdn.net/fkmmmm/article/details/108565578

相关标签: 编译原理