⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 syntax.cpp

📁 使用C++实现的Java语言子集词法、语法、语义分析器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "syntax.h"

Syntax::Syntax(char * fn_in, char * fn_syn, char * fn_asm, char * fn_ers)
{
    char line[MAX_LINE];    //读入的行
    struct Word theword;    //读入的单词
    int tmp;    //临时变量

    id_index = 0;
    lp_index = 0;

    memset(asm_all, 0, MAX_FILE);
    memset(asm_code, 0, MAX_FILE);
    memset(asm_data, 0, MAX_FILE);

    //将词法分析结果读入wordlist
    inFile.open(fn_in);
    if (!inFile.is_open())
    {
        return;
    }
    inFile.getline(line, MAX_LINE);
    while(!inFile.eof())
    {
        sscanf(line, "%d\t", &(theword.detail));
        theword.value.int_val = 0;
        if (theword.detail == P_INTLITERAL)
        {
            sscanf(line, "%d\t%d\t%d\t%d", &tmp, &(theword.line), &(theword.col), &(theword.value.int_val));
        }
        else
        {
            sscanf(line, "%d\t%d\t%d\t%s", &tmp, &(theword.line), &(theword.col), &(theword.value.name));
        }
        wordlist.push_back(theword);
        inFile.getline(line, MAX_LINE);
    }
    theword.detail = P_EOF;
    theword.value.int_val = 0;
    wordlist.push_back(theword);
    inFile.close();

    //创建输出和错误文件
    FILE * fp;
    fp = fopen(fn_syn, "w");
    fclose(fp);
    fp = fopen(fn_asm, "w");
    fclose(fp);
    fp = fopen(fn_ers, "w");
    fclose(fp);
    synFile.open(fn_syn, ios::out | ios::app);
    asmFile.open(fn_asm, ios::out | ios::app);
    ersFile.open(fn_ers, ios::out | ios::app);
}

Syntax::~Syntax()
{
    if (!synFile.is_open())
    {
        synFile.close();
    }
    if (!asmFile.is_open())
    {
        asmFile.close();
    }
    if (!ersFile.is_open())
    {
        ersFile.close();
    }
}

void Syntax::MakeTree()
{
    synFile << "语法分析开始" << endl;
    ptr = wordlist.begin();
    Deal_Prg();
    synFile << "语法分析结束" << endl;
}

void Syntax::WriteAsm()
{
    strcpy(asm_all, ASMBEGIN);
    strcat(asm_all, STACKSG);
    strcat(asm_all, DATA_BEGIN);
    strcat(asm_all, asm_data);
    strcat(asm_all, DATA_END);
    strcat(asm_all, CODE_BEGIN);
    strcat(asm_all, asm_code);
    strcat(asm_all, CODE_END);
    asmFile << asm_all;
}

void Syntax::Deal_Prg()
{
    if (((Word)*ptr).detail == P_WHILE || ((Word)*ptr).detail == P_IDENTIFIER)
    {
        Deal_Stc();
        Deal_Prg();
    }
    else if (((Word)*ptr).detail == P_EOF)
    {
        return;
    }
    else
    {
        TellError("非法的语句起始单词");
    }
}

void Syntax::Deal_Stc()
{
    if (((Word)*ptr).detail == P_WHILE)
    {
        Deal_Swh();
    }
    else if (((Word)*ptr).detail == P_IDENTIFIER)
    {
        Deal_Sas();
    }
    else
    {
        TellError("非法的语句起始单词");
    }
}

void Syntax::Deal_Sas()
{
    char lvalue[MAX_WORD];
    synFile << "赋值语句" << endl;
    Asm_Comment("赋值开始");
    if (((Word)*ptr).detail == P_IDENTIFIER)
    {
        synFile << "  左值是" << ((Word)*ptr).value.name << endl;
        strcpy(lvalue, ((Word)*ptr).value.name);
        Asm_Define(lvalue);
        ptr++;
        if (((Word)*ptr).detail == P_EQ)
        {
            synFile << "  右值是";
            ptr++;
            Deal_Exp();
            if (((Word)*ptr).detail == P_SEMI)
            {
                Asm_Assign(lvalue);
                ptr++;
            }
            else
            {
                TellError("语句结束缺少“;”");
            }
        }
        else
        {
            TellError("标识符后仅允许使用“=”赋值");
        }
    }
    else
    {
        TellError("非法的语句起始单词");
    }
    Asm_Comment("调用printf输出开始");
    char item[MAX_LINE];
    sprintf(item,
        "        PUSH    AX\n"
        "        LEA     BX, %s%d\n"
        "        PUSH    BX\n"
        "        LEA     BX, PRN_STR\n"
        "        PUSH    BX\n"
        "        CALL    printf\n"
        "        ADD     SP, 6\n"
        , DATA_NAME, Id_To_Index(lvalue));
    strcat(asm_code, item);
    Asm_Comment("调用printf输出结束");
    Asm_Comment("赋值结束");
}

void Syntax::Deal_Swh()
{
    synFile << "循环体开始" << endl;
    if (((Word)*ptr).detail == P_WHILE)
    {
        Asm_WhileBegin();
        ptr++;
        if (((Word)*ptr).detail == P_LPAREN)
        {
            ptr++;
            Deal_Exr();
            if (((Word)*ptr).detail == P_RPAREN)
            {
                ptr++;
                Deal_Sas();
                Asm_WhileEnd();
            }
            else
            {
                TellError("while语句的比较表达式缺少“)”");
            }
        }
        else
        {
            TellError("while语句的比较表达式缺少“(”");
        }
    }
    else
    {
         TellError("非法的语句起始单词");
    }
    synFile << "循环体结束" << endl;
}

void Syntax::Deal_Exr()
{
    int cmp_detail; //比较运算符的详细属性字
    struct Word lvalue, rvalue; //比较对象
    Asm_Comment("比较表达式开始");
    synFile << "比较表达式" << endl;
    synFile << "  左值";
    Deal_Val(&lvalue);
    synFile << endl;
    synFile << "  ";
    Deal_Cmp(&cmp_detail);
    synFile << endl;
    synFile << "  右值";
    Deal_Val(&rvalue);
    synFile << endl;
    synFile << "  的时候为真" << endl;
    if (lvalue.detail == P_IDENTIFIER)
    {
        Asm_ToStack(lvalue.value.name);
    }
    else if (lvalue.detail == P_INTLITERAL)
    {
        Asm_ToStack(lvalue.value.int_val);
    }
    if (rvalue.detail == P_IDENTIFIER)
    {
        Asm_ToStack(rvalue.value.name);
    }
    else if (rvalue.detail == P_INTLITERAL)
    {
        Asm_ToStack(rvalue.value.int_val);
    }
    if (cmp_detail == P_LT)
    {
        Asm_WhileLoop("JNL");
    }
    else if (cmp_detail == P_GT)
    {
        Asm_WhileLoop("JNG");
    }
    Asm_Comment("比较表达式结束");
}

void Syntax::Deal_Cmp(int * _detail)
{
    *_detail = ((Word)*ptr).detail;
    if (((Word)*ptr).detail == P_GT)
    {
        synFile << "大于";
        ptr++;
    }
    else if (((Word)*ptr).detail == P_LT)
    {
        synFile << "小于";
        ptr++;
    }
    else
    {
        TellError("比较表达式中仅允许使用“>”和“<”运算");
    }
}

void Syntax::Deal_Add(bool _sign, struct Word * word)
{
    if (((Word)*ptr).detail == P_PLUS)
    {
        if (word != NULL)
        {
            word->detail = P_PLUS;
            word->value.is_sign = false;
        }
        synFile << "+";
        ptr->value.is_sign = _sign;
        ptr++;
    }
    else if (((Word)*ptr).detail == P_SUB)
    {
        if (word != NULL)
        {
            word->detail = P_SUB;
            word->value.is_sign = false;
        }
        synFile << "-";
        ptr->value.is_sign = _sign;
        ptr++;
    }
    else
    {
        TellError("此处期待出现“+”或“-”运算符");
    }
}

void Syntax::Deal_Mul(struct Word * word)
{
    if (((Word)*ptr).detail == P_STAR)
    {
        if (word != NULL)
        {
            word->detail = P_STAR;
            strcpy(word->value.name, "*");
        }
        synFile << "*";
        ptr++;
    }
    else if (((Word)*ptr).detail == P_SLASH)
    {
        if (word != NULL)
        {
            word->detail = P_SLASH;
            strcpy(word->value.name, "/");
        }
        synFile << "/";
        ptr++;
    }
    else
    {
        TellError("此处期待出现“*”或“/”运算符");
    }
}

void Syntax::Deal_Val(struct Word * word)
{
    if (((Word)*ptr).detail == P_IDENTIFIER)
    {
        Asm_Define(((Word)*ptr).value.name);
        if (word != NULL)
        {
            word->detail = P_IDENTIFIER;
            strcpy(word->value.name, ((Word)*ptr).value.name);
        }
        synFile << ((Word)*ptr).value.name;
        ptr++;
    }
    else if (((Word)*ptr).detail == P_PLUS || ((Word)*ptr).detail == P_SUB || ((Word)*ptr).detail == P_INTLITERAL)
    {
        int _val;
        Deal_Int(&_val);
        if (word != NULL)
        {
            word->detail = P_INTLITERAL;
            word->value.int_val = _val;
        }
    }
    else
    {
        TellError("非法的操作数");
    }
}

void Syntax::Deal_Int(int * int_val)
{
    int sign = 1;   //1为正,-1为负
    if (((Word)*ptr).detail == P_PLUS || ((Word)*ptr).detail == P_SUB)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -