【编译原理】机测笔记

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

< 参考代码 >

cpp 复制代码
#include "iostream"
using namespace std;
// 定义6个关键词
string S[6] = {"main", "for", "if", "else", "int", "while"};

// Todo: 设置display 函数用于输出关键词、整数、自定义字符
void display(string s){
    //如果传入的字串第一个字符是数字,那肯定剩下的全部是数字,所以判断头一个即可
    if(s[0] >= '0' && s[0] <= '9')
        cout<<"(integer,"<<s<<")"<<endl;
    else{
        // 定义一个flag参数用于判断是否找到关键字
        int flag = 1;
        for(int i = 0; i < 6; i++){
            // 找到关键字并输出,记得将flag变为0
            if(s == S[i]){
                flag = 0;
                cout<<"(keyword,"<<s<<")"<<endl;
            }
        }
        //如果既不是数字又不是关键字,那么肯定是自定义字符
        if(flag == 1)
            cout<<"(identifier,"<<s<<")"<<endl;
    }
}
//要知道display函数是在判断完不是界符和标识符的基础上判断剩下的三种符号的。

// Todo: 主函数
int main(){
    string s;
    while(cin>>s){
        // 调用length函数保存输入字符长度
        int len = s.length();
        // 定义字串a并初始化为空字符
        string a = "";
        for(int i = 0; i < len; i++){
            if(s[i] == '=' || s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '<' || s[i] == '>' || s[i] == '!'){
                // 如果a不为空,则进入display函数进行判断是那种词法
                if(a.length())
                    display(a);
                a = "";
                // 此处是判断>= <= !=的情况
                if(i + 1 < len && s[i + 1] == '='){
                    cout<<"(operator,"<<s[i]<<s[i + 1]<<")"<<endl;
                    i++;    // 记得将i+1,不然下次循环会重复判断
                }
                else
                    cout<<"(operator,"<<s[i]<<")"<<endl;

            }
            else if(s[i] == '(' || s[i] == ')' || s[i] == '{' || s[i] == '}' || s[i] == ',' || s[i] == ';'){
                if(a.length())
                    display(a);//同上
                a = "";
                cout<<"(boundary,"<<s[i]<<")"<<endl;
            }
            else
                a = a + s[i];
        }
        // 此处是为了避免a中还存留输入的字符没进行判断,所以最后再调用一次display函数进行清空操作
        if(a.length())
            display(a);
    }
    return 0;
}

< 代码思路 >

int main()

  • 调用length函数保存输入字符长度
  • 定义字串a并初始化为空字符
  • 判断是不是界符和标识符 → 判断剩下的三种符号
    • 如果a不为空,则进入display()函数进行判断是那种词法
    • 此处是判断>= <= !=的情况(记得将i+1,不然下次循环会重复判断)
    • 此处是判断 ( ) { } 的情况
  • 避免a中还存留输入的字符没进行判断,所以最后再调用一次display函数进行清空操作

void display( string s)

  • 如果传入的字串第一个字符是数字,那肯定剩下的全部是数字,所以判断头一个即可
  • 定义一个flag参数用于判断是否找到关键字,找到关键字并输出,记得将flag变为0
  • 如果既不是数字又不是关键字,那么肯定是自定义字符

相关推荐
Abdullah al-Sa1 分钟前
Docker教程(喂饭级!)
c++·人工智能·docker·容器
进击的_鹏3 分钟前
【C++】list 链表的使用+模拟实现
开发语言·c++·链表
CodeJourney.17 分钟前
EndNote与Word关联:科研写作的高效助力
数据库·人工智能·算法·架构
SRA.23 分钟前
STM32——HAL库开发笔记22(定时器3—呼吸灯实验)(参考来源:b站铁头山羊)
笔记·stm32·嵌入式硬件
SRA.24 分钟前
STM32——HAL库开发笔记21(定时器2—输出比较)(参考来源:b站铁头山羊)
笔记·stm32·嵌入式硬件
大模型铲屎官27 分钟前
哈希表入门到精通:从原理到 Python 实现全解析
开发语言·数据结构·python·算法·哈希算法·哈希表
C语言扫地僧43 分钟前
RPC 框架项目剖析
c++·网络协议·学习·rpc
果壳中的robot1 小时前
【ORB-SLAM3】鲁棒核函数的阈值设置
算法·计算机视觉·机器人
DKPT1 小时前
计算机网络之路由协议(自治系统)
开发语言·笔记·学习·计算机网络·算法
水月梦镜花1 小时前
数据结构:基数排序(c++实现)
开发语言·数据结构·c++