编译原理_词法分析程序设计

题目:


这里写图片描述

代码:

我是把所有的代码内容输入完毕后再进行分析的。

有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");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值