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

📄 syntax.h

📁 使用C++实现的Java语言子集词法、语法、语义分析器
💻 H
字号:
#ifndef SYNTAX_H
#define SYNTAX_H

#include <cstdio>
#include <cstring>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#include <stack>
#include "constant.h"
#include "structs.h"
#include "asmlang.h"

using namespace std;

//语法、语义分析器类
class Syntax
{
private:
    ifstream inFile;    //输入文件
    ofstream synFile, asmFile, ersFile;  //输出文件与错误文件

    vector<Word> wordlist;  //单词序列(词法分析结果)
    vector<Word>::iterator ptr; //单词序列指针
    vector<IdType> idlist;  //标识符序列
    vector<IdType>::iterator idptr; //标识符序列指针

    stack<Word> opnd;   //操作数栈
    stack<Word> optr;   //运算符栈

    char asm_all[MAX_FILE]; //生成的汇编语言全文
    char asm_code[MAX_FILE];    //生成的汇编语言代码段
    char asm_data[MAX_FILE];    //生成的汇编语言数据段

    int id_index;   //标识符索引
    int lp_index;   //循环体索引

    void TellError(const char * reason);   //报告错误

    //递归下降分析器
    void Deal_Prg();
    void Deal_Stc();
    void Deal_Sas();
    void Deal_Swh();
    void Deal_Exr();
    void Deal_Cmp(int * _detail);    //参数为返回的比较运算符的详细属性字
    void Deal_Add(bool _sign, struct Word * word = NULL);  //_sign:对于“+”、“-”,表示正负时为true,表示加减时为false
                                                           //word:参数为返回的运算符
    void Deal_Mul(struct Word * word = NULL);   //参数为返回的运算符
    void Deal_Val(struct Word * word = NULL);   //参数为返回的单词
    void Deal_Int(int * int_val = NULL);  //参数为返回的整数值
    void Deal_Exp();
    void Deal_Ex1();
    void Deal_Ext();
    void Deal_Et1();

    int Id_To_Index(const char * id);  //由标识符查找索引,不存在返回-1
    char GetOptrPri(struct Word * word1, struct Word * word2);  //查找运算符优先级

    //生成汇编语句
    void Asm_Define(const char * id);   //定义变量
    void Asm_Assign(const char * id);   //赋值
    void Asm_ToReg(const char * id, const char * regname);  //标识符对应变量读入寄存器
    void Asm_ToReg(const int imnum, const char * regname);  //立即数读入寄存器
    void Asm_ToStack(const char * id);  //标识符对应变量压栈
    void Asm_ToStack(const int imnum);  //立即数压栈
    void Asm_PopToReg(const char * regname);    //出栈
    void Asm_WhileBegin();  //循环开始
    void Asm_WhileLoop(const char * jump);  //循环判断(jump=跳出循环的跳转语句)
    void Asm_WhileEnd();    //循环结束
    void Asm_DoAdd();   //做加法
    void Asm_DoSub();   //做减法
    void Asm_DoMul();   //做乘法
    void Asm_DoDiv();   //做除法
    void Asm_Expression(struct Word * theoptr_ptr); //处理表达式
    void Asm_Comment(const char * comment); //加入注释
public:
    Syntax(char * fn_in, char * fn_syn, char * fn_asm, char * fn_ers);  //构造函数
    ~Syntax(); //析构函数
    void MakeTree(); //构造语法树
    void WriteAsm(); //生成汇编语言
    bool Ready(); //是否就绪
};

#endif

⌨️ 快捷键说明

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