SDUTACM小C语言--词法分析程序

简介: SDUTACM小C语言--词法分析程序

题目简介

题目思路

首题目给的条件是:

  • 关键字:main if else for while int
  • 自定义标识符:除关键字外的标识符
  • 整数:无符号整数
  • 界符:{ } ( ) , ;
  • 运算符:= + - * / < <= > >= == !=

当出现这些符号时,需要进行判断,来获取输出,输出的格式如以下所示:

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

主程序中用一个temp字符串来存储非运算符、界符之外的字符。

以样例为例:

当跑main时,他会把main储存到temp字符串数组中,当跑到(时,他会判断temp中的字符,来判断其是不是关键字,如果是的话,进行输出,不是的话,输出其为自定义标识符。其他的也同理,最后判断输出temp。

注意注意

  1. 第一个错的地方,容易出现在判断 <= 这类,忘记i++
  2. 第二个错误的地方,容易出现在输出上面,经常性的会漏掉输出中个某个逗号或者其他的

代码

/*
author:苦酒
QQ:1793929520
blog:huangliangshuai.com
*/
#include <iostream>
#include <string>
using namespace std;
string kind[5] = {"keyword","identifier","integer","boundary","operator"};
string keyword[6] = {"main","if","else","for","while","int"};
void decide(string s)
{
    if(s[0] >= '0' && s[0] <= '9')//如果当前判断的第一个字符为数字的话,直接输出
    {
        cout<<"("<<kind[2]<<","<<s<<")"<<endl;
    }
    else
    {
        int f = 0;//此处作为标记
        for(int i = 0; i < 6; i++)
        {
            if(s == keyword[i])//如果当前temp存储的字符串与关键字里面的字符串相等,则改变标记的数值,并且输出关键字,终止循环,节省时间
            {
                f = 1;
                cout<<"("<<kind[0]<<","<<s<<")"<<endl;
                break;
            }
        }
        if(f == 0)//如果找不到关键字的话,则认为这是一个自定义标识符,进行输出
        {
            cout<<"("<<kind[1]<<","<<s<<")"<<endl;
        }
    }
}
int main()
{
    string s;
    while(cin>>s)
    {
        string temp;
        temp = "";
        int len = s.length();
        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())
                {
                    decide(temp);
                }
                temp = "";
                if(i + 1 < len && s[i + 1] == '=')//判断输入的是不是<= >= == ,是的话就进行输出、
                {
                    cout<<"("<<kind[4]<<","<<s[i]<<s[i+1]<<")"<<endl;
                    i++;
                }
                else
                {
                    cout<<"("<<kind[4]<<","<<s[i]<<")"<<endl;//反之就输出单字符的运算符
                }
            }
            else if(s[i] == '(' || s[i] == ')' || s[i] == '{' || s[i] == '}' || s[i] == ',' || s[i] == ';')//判断当前是不是界符
            {
                if(temp.length())
                {
                    decide(temp);
                }
                temp = "";
                cout<<"("<<kind[3]<<","<<s[i]<<")"<<endl;
            }
            else
            {
                temp = temp + s[i];//将全部不是的存储到temp里面
            }
        }
        if(temp.length())
        {
            decide(temp);
        }
    }
    return 0;
}
/***************************************************
User name: jk170631黄良帅
Result: Accepted
Take time: 0ms
Take Memory: 196KB
Submit time: 2019-11-18 21:33:32
****************************************************/


相关文章
|
1月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
3月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
102 1
|
3月前
|
NoSQL 编译器 程序员
【C语言】揭秘GCC:从平凡到卓越的编译艺术,一场代码与效率的激情碰撞,探索那些不为人知的秘密武器,让你的程序瞬间提速百倍!
【8月更文挑战第20天】GCC,GNU Compiler Collection,是GNU项目中的开源编译器集合,支持C、C++等多种语言。作为C语言程序员的重要工具,GCC具备跨平台性、高度可配置性及丰富的优化选项等特点。通过简单示例,如编译“Hello, GCC!”程序 (`gcc -o hello hello.c`),展示了GCC的基础用法及不同优化级别(`-O0`, `-O1`, `-O3`)对性能的影响。GCC还支持生成调试信息(`-g`),便于使用GDB等工具进行调试。尽管有如Microsoft Visual C++、Clang等竞品,GCC仍因其灵活性和强大的功能被广泛采用。
126 1
|
3月前
|
编译器 C语言 计算机视觉
C语言实现的图像处理程序
C语言实现的图像处理程序
155 0
|
6月前
|
存储 C语言
简单c语言程序举例
简单c语言程序举例
82 1
|
1月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
2月前
|
存储 编译器 程序员
C语言程序的基本结构
C语言程序的基本结构包括:1)预处理指令,如 `#include` 和 `#define`;2)主函数 `main()`,程序从这里开始执行;3)函数声明与定义,执行特定任务的代码块;4)变量声明与初始化,用于存储数据;5)语句和表达式,构成程序基本执行单位;6)注释,解释代码功能。示例代码展示了这些组成部分的应用。
95 10
|
3月前
|
自然语言处理 编译器 C语言
C语言程序的编译
C语言程序的编译
65 2
|
4月前
|
前端开发 C语言 C++
C语言03----第一个程序HelloWorld(vs版)
C语言03----第一个程序HelloWorld(vs版)
|
5月前
|
C语言 图形学 C++