开始时间 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;
}