题目:
代码:
我是把所有的代码内容输入完毕后再进行分析的。
有find函数
#include<string>
#include<iostream>
#include<vector>
using namespace std;
vector<string> integer; //保存无符号整数
vector<string> identifier; //保存标识符
vector<string> text; // 每一个string表示一行
struct { int number; string str[10]; } keywords = { 3,"int","main","return" }; //关键词
struct { int number; string str[10]; } operators = { 5,"+","*","=","+=","*=" }; //运算符
struct { int number; string str[10]; } boundaries = { 6,"(",")","{","}",",",";" }; //分界符
struct { int number; string str[100]; } identifieres = { 0 }; //标识符
struct { int number; string str[100]; } Unsigned_integer = { 0 }; //无符号整数
bool isLetter(char temp) {
if ('a' <= temp && 'z' >= temp) return true;
if ('A' <= temp && 'Z' >= temp) return true;
return false;
}
bool isDigit(char temp) {
if (temp >= '0' && temp <= '9') return true;
return false;
}
void printInFormat(int a, int b) {
cout << '<' << a << ',' << b << '>';
}
void lexer(string str) {
string tmp;
string::const_iterator it = str.begin();
while (it != str.end()) {
if (*it == ' ' || *it == '\t') {
it++;
continue;
}
if (*it == '#') break;
// 分界符
switch (*it) {
case '(':
printInFormat(3, 0);
it++;
break;
case ')':
printInFormat(3, 1);
it++;
break;
case '{':
printInFormat(3, 2);
it++;
break;
case '}':
printInFormat(3, 3);
it++;
break;
case ',':
printInFormat(3, 4);
it++;
break;
case ';':
printInFormat(3, 5);
it++;
break;
default: break;
}
// 运算符
if (it != str.end() && *it == '+') {
if (it + 1 != str.end() && *(it + 1) == '=') {
printInFormat(2, 3);
it++;
}
else {
printInFormat(2, 0);
}
it++;
}
if (it != str.end() && *it == '*') {
if (it + 1 != str.end() && *(it + 1) == '=') {
printInFormat(2, 4);
it++;
}
else {
printInFormat(2, 1);
}
it++;
}
if (it != str.end() && *it == '=') {
printInFormat(2, 2);
it++;
}
// 无符号整数
tmp.clear();
while (it != str.end() && isDigit(*it)) {
tmp += *it;
it++;
}
if (tmp != "") {
auto itTemp = find(integer.begin(), integer.end(), tmp);
if (itTemp != integer.end())
{
printInFormat(5, itTemp - integer.begin());
}
else {
integer.push_back(tmp);
printInFormat(5, integer.end() - integer.begin() - 1);
}
}
// 关键词和标识符 -- 首字母是letter。关键字不能出现数字,先默认为关键字
tmp.clear();
bool isKeyword = true;
if (it != str.end() && isLetter(*it)) {
tmp += *it;
it++;
}
while (it != str.end() && (isDigit(*it) || isLetter(*it))) {
if (isKeyword && isDigit(*it)) {
isKeyword = false;
}
tmp += *it;
it++;
}
if (isKeyword) {
if (tmp == "int") {
printInFormat(1, 0);
}
else if (tmp == "main") {
printInFormat(1, 1);
}
else if (tmp == "return") {
printInFormat(1, 2);
}
else {
isKeyword = false;
}
}
if(tmp != "" && isKeyword == false) { // 是标识符
auto itTemp = find(identifier.begin(), identifier.end(), tmp);
if (itTemp != identifier.end())
{
printInFormat(4, itTemp - identifier.begin());
}
else {
identifier.push_back(tmp);
printInFormat(4, identifier.end() - identifier.begin() - 1);
}
}
}
}
int main() {
char ch;
string str = "";
getline(cin, str);
text.push_back(str);
while (str.size() > 0 && *(str.end() - 1) != '#') {
getline(cin, str);
text.push_back(str);
}
for (int i = 0; i < text.size(); i++) {
lexer(text[i]);
}
cout << "\nidentifieres:";
for (int i = 0; i< identifier.size(); i++) cout << identifier[i] << " ";
cout << "\nUnsigned_integer:";
for (int i = 0; i < integer.size(); i++) cout << integer[i] << " ";
system("pause");
}
提交的没有find函数版本:
#include<string>
#include<iostream>
#include<vector>
using namespace std;
vector<string> integer; //保存无符号整数
vector<string> identifier; //保存标识符
vector<string> text; // 每一个string表示一行
struct { int number; string str[10]; } keywords = { 3,"int","main","return" }; //关键词
struct { int number; string str[10]; } operators = { 5,"+","*","=","+=","*=" }; //运算符
struct { int number; string str[10]; } boundaries = { 6,"(",")","{","}",",",";" }; //分界符
struct { int number; string str[100]; } identifieres = { 0 }; //标识符
struct { int number; string str[100]; } Unsigned_integer = { 0 }; //无符号整数
bool isLetter(char temp) {
if ('a' <= temp && 'z' >= temp) return true;
if ('A' <= temp && 'Z' >= temp) return true;
return false;
}
bool isDigit(char temp) {
if (temp >= '0' && temp <= '9') return true;
return false;
}
void printInFormat(int a, int b) {
cout << '<' << a << ',' << b << '>';
}
void lexer(string str) {
string tmp;
string::const_iterator it = str.begin();
while (it != str.end()) {
if (*it == ' ' || *it == '\t') {
it++;
continue;
}
if (*it == '#') break;
// 分界符
switch (*it) {
case '(':
printInFormat(3, 0);
it++;
break;
case ')':
printInFormat(3, 1);
it++;
break;
case '{':
printInFormat(3, 2);
it++;
break;
case '}':
printInFormat(3, 3);
it++;
break;
case ',':
printInFormat(3, 4);
it++;
break;
case ';':
printInFormat(3, 5);
it++;
break;
default: break;
}
// 运算符
if (it != str.end() && *it == '+') {
if (it + 1 != str.end() && *(it + 1) == '=') {
printInFormat(2, 3);
it++;
}
else {
printInFormat(2, 0);
}
it++;
}
if (it != str.end() && *it == '*') {
if (it + 1 != str.end() && *(it + 1) == '=') {
printInFormat(2, 4);
it++;
}
else {
printInFormat(2, 1);
}
it++;
}
if (it != str.end() && *it == '=') {
printInFormat(2, 2);
it++;
}
// 无符号整数
tmp.clear();
while (it != str.end() && isDigit(*it)) {
tmp += *it;
it++;
}
if (tmp != "") {
int index;
for (index = 0; index < integer.size(); index++) {
if (integer[index] == tmp) {
break;
}
}
if (index != integer.size())
{
printInFormat(5, index);
}
else {
integer.push_back(tmp);
printInFormat(5, integer.size() - 1);
}
}
// 关键词和标识符 -- 首字母是letter。关键字不能出现数字,先默认为关键字
tmp.clear();
bool isKeyword = true;
if (it != str.end() && isLetter(*it)) {
tmp += *it;
it++;
}
while (it != str.end() && (isDigit(*it) || isLetter(*it))) {
if (isKeyword && isDigit(*it)) {
isKeyword = false;
}
tmp += *it;
it++;
}
if (isKeyword) {
if (tmp == "int") {
printInFormat(1, 0);
}
else if (tmp == "main") {
printInFormat(1, 1);
}
else if (tmp == "return") {
printInFormat(1, 2);
}
else {
isKeyword = false;
}
}
if(tmp != "" && isKeyword == false) { // 是标识符
int index;
for (index = 0; index < identifier.size(); index++) {
if (tmp == identifier[index])
break;
}
if (index != identifier.size())
{
printInFormat(4, index);
}
else {
identifier.push_back(tmp);
printInFormat(4, identifier.size() - 1);
}
}
}
}
int main() {
char ch;
string str = "";
getline(cin, str);
text.push_back(str);
while (str.size() > 0 && *(str.end() - 1) != '#') {
getline(cin, str);
text.push_back(str);
}
for (int i = 0; i < text.size(); i++) {
lexer(text[i]);
}
cout << "\nidentifieres:";
for (int i = 0; i< identifier.size(); i++) cout << identifier[i] << " ";
cout << "\nUnsigned_integer:";
for (int i = 0; i < integer.size(); i++) cout << integer[i] << " ";
system("pause");
}