11.1 (C++)

开始时间 2021-05-18 16:00:00
截止时间 2021-05-24 21:00:00

请写一个简单的 C++ 词法分析器。
词法分析器:作为编译器的第一个步骤首先要把源语言中的每个词找出来,有些语言把空格、制表符、换行符忽略掉。
C++中的词包括:保留字,标识符,常量,和标点符号等。
改作业时的实际的保留字和常量的类型不会多于example input中的保留字和常量的类型。

EXAMPLE INPUT


class Cat {
public:
    int id;
    Cat(int id) {
        this->id = id;
    }
    void print() {
        cout << id;
    }
};

int main() {
    Cat cat(123);
    cat.print();
}

EXAMPLE OUTPUT

class
Cat
{
public
:
int
id
;
Cat
(
int
id
)
{
this
->
id
=
id
;
}
void
print
(
)
{
cout
<<
id
;
}
}
;
int
main
(
)
{
Cat
cat
(
123
)
;
cat
.
print
(
)
;
}

主程序 (不能修改)

#include "source.cpp"

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

string readAll() {
    string all;
    string line;
    while (getline(cin, line))
        all += line + '\n';
    return all;
}

int main() {
    string program = readAll();
    vector<string> words = lexicalAnalysis(program);
    for (int i = 0; i < words.size(); ++ i) {
        cout << words[i] << endl;
    }
}

Aholic的答案

#include<cstring>
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<string> lexicalAnalysis(string line){
    vector<string> word;
    int i=0;
    while( i < line.length()){        
        if(((line[i]>='a')&&(line[i]<='z'))||((line[i]>='A')&&(line[i]<='Z'))){
            int j=i;
            int count=0;
            char t[1000];
            memset(t,0,sizeof(t));
            while (((line[j]>='a')&&(line[j]<='z'))||((line[j]>='A')&&(line[j]<='Z'))||(line[j]>='0')&&(line[j]<='9')){
                t[count]=line[j];
                count++;
                j++;
            }
            i=j;
            word.push_back(t);
        }
        if((line[i]>='0')&&(line[i]<='9')){
            int j=i;
            int count=0;
            char t[1000];
            memset(t,0,sizeof(t));
            while((line[j]>='0')&&(line[j]<='9')){
                t[count]=line[j];
                count++;
                j++;
            }
            i=j;
            word.push_back(t);
        }
        if(line[i]=='('){
            word.push_back("(");
        }
        if(line[i]==')'){
            word.push_back(")");
        }
        if(line[i]=='{'){
            word.push_back("{");
        }
        if(line[i]=='}'){
            word.push_back("}");
        }
        if(line[i]=='='){
            word.push_back("=");
        }
        if(line[i]=='-'&&line[i+1]=='>'){
            word.push_back("->");
            i++;
        }
        if(line[i]=='>'&&line[i+1]=='>'){
            word.push_back(">>");
            i++;
        }
        if(line[i]=='<'&&line[i+1]=='<'){
            word.push_back("<<");
            i++;
        }
        if(line[i]==':'){
            word.push_back(":");
        }
        if(line[i]==';'){
            word.push_back(";");
        }
        if(line[i]=='.'){
            word.push_back(".");
        }
        i++;
    }
    return word;
}
上一篇: 11.3 (C++) 下一篇: 10.2(C++)
支持 makedown语法