• 大小: 8KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-07-26
  • 语言: 其他
  • 标签: 编译原理  

资源简介

编译原理课程设计之编译器(完整代码 + 测试样例):包含了完整的编译器源代码和测试样例,内容上实现了一体化的词法分析 + 语法分析 + 语法制导翻译,最后生成对应汇编指令

资源截图

代码片段和文件信息

#include 
using namespace std;
const int maxn = 1002;
const int n_key = 41;
const int n_oper = 21;

char c;

string key_word[n_key] = {“auto“ “enum“ “restrict“ “unsigned“ “break“
                    “extern“ “return“ “void“ “case“ “float“
                    “short“ “volatile“ “char“ “for“ “signed“
                    “while“ “const“ “goto“ “sizeof“ “_Bool“
                    “continue“ “if“ “static“ “_Complex“ “default“
                    “inline“ “struct“ “_Imaginary“ “do“ “int“
                    “switch“ “double“ “long“ “typedef“ “else“
                    “register“ “union“ “scanf“ “printf“ “cin“
                    “cout“
};

string oper[] = {“+“ “-“ “*“ “/“ “^“
                “<“ “>“ “++“ “--“ “==“
                “*=“ “/=“ “>=“ “<=“ “<<“
                “>>“ “>>=“ “<<=“ “%“ “&“
                “^“
};

char bound[] = {‘‘ ‘;‘ ‘(‘ ‘)‘ ‘[‘ ‘]‘ ‘{‘ ‘}‘};

struct Word{                //词结构体
    int id;
    string value;
};

struct Num{
    int id;
    int vi;
    double vd;
};
Num n[maxn];        //数字
Word w[maxn];       //词
map m;    //标识符
int f = 0 ff = 0;



//语法分析
typedef pair P;
map pre_list;
typedef set Sets;
map first follow wenfa select;      //first follow
Sets Term Nterm;                //终极符,非终极符
string Start;

typedef struct node{
    string value;
    string type;
    int number;
}pro;
vector watest;





//translation翻译

//词法分析
bool is_oper(string s){
    for(int i=0; i    return false;
}

bool is_bound(char c){
    for(int i=0; i    return false;
}

bool is_key(string s){
    for(int i=0; i    return false;
}

int stoi(string s){                         //get int
    int ans = 0;
    for(int i=0; i    return ans;
}

double stof(string s){                      //get double
    long long ans = 0;
    int fd = -1 fe = -1;
    for(int i=0; i        if(s[i] == ‘.‘){
            fd = i;
            continue;
        }
        if(s[i] == ‘e‘){
            fe = i;
            continue;
        }
        ans = ans * 10 + s[i] - ‘0‘;
    }
    if(fd != -1 && fe == -1) return double(ans)/(pow(10 s.size() - fd - 1));
    else if(fd == -1 && fe != -1){
        long long temp = ans % (long long)pow(10 s.size() - fe - 1);     //得到e后的数字
        ans /= pow(10 s.size() - fe - 1);                          //得到e前的数字
        return double(ans*pow(10 temp));
    }
    else{
        long long temp = ans % (long long)pow(10 s.size() - fe - 1);     //得到e后的数字
        cout<        ans /= pow(10 s.size() - fe - 1);                       

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2015-07-29 15:44  编译器\
     文件        1617  2015-06-25 19:21  编译器\grammar.txt
     文件         193  2015-06-25 15:36  编译器\programe.txt
     文件       34619  2015-07-02 10:16  编译器\word_grammar_translation.cpp

评论

共有 条评论