From 6f6fb5537ca2c8bf3e7a0b8314ea7670c49a7da0 Mon Sep 17 00:00:00 2001 From: qihaoyu Date: Fri, 14 May 2021 19:47:55 +0800 Subject: [PATCH] sync --- ObjectCodeGenerator.cpp | 2 + ParserAndSemanticAnalyser.cpp | 70 ++++++++++++++++++++++++++++++++ ParserAndSemanticAnalyser.h | 12 ++++++ productions.txt | 10 ++++- productions_with_array.txt | 30 ++++++++++++++ productions_with_explanation.txt | 15 ++++++- 6 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 productions_with_array.txt diff --git a/ObjectCodeGenerator.cpp b/ObjectCodeGenerator.cpp index 132f92b..6ff7499 100644 --- a/ObjectCodeGenerator.cpp +++ b/ObjectCodeGenerator.cpp @@ -125,10 +125,12 @@ string ObjectCodeGenerator::allocateReg() { } } } + // 不存在变量仅存储在寄存器中且未来会当作源操作数引用,直接用该寄存器 if (nextpos == inf) { ret = iter->first; break; } + // 更新maxNextPos查找引用位置最远的寄存器 else if (nextpos > maxNextPos) { maxNextPos = nextpos; ret = iter->first; diff --git a/ParserAndSemanticAnalyser.cpp b/ParserAndSemanticAnalyser.cpp index 084316d..34088c4 100644 --- a/ParserAndSemanticAnalyser.cpp +++ b/ParserAndSemanticAnalyser.cpp @@ -56,6 +56,10 @@ Parameter::Parameter(const Symbol& sym) : Symbol(sym) {} ParameterList::ParameterList(const Symbol& sym) : Symbol(sym) {} +ArrayDeclare::ArrayDeclare(const Symbol& sym) : Symbol(sym) {} + +ArrayDeclareList::ArrayDeclareList(const Symbol& sym) : Symbol(sym) {} + SentenceBlock::SentenceBlock(const Symbol& sym) : Symbol(sym) {} SentenceList::SentenceList(const Symbol& sym) : Symbol(sym) {} @@ -1036,6 +1040,72 @@ void ParserAndSemanticAnalyser::analyse(list&words, ostream& out) { pushSymbol(argument_list1); break; } + case 52://declare ::= int ID array_declare_list + { + ArrayDeclareList* array_declare_list = (ArrayDeclareList*)popSymbol(); + Id* ID = (Id*)popSymbol(); + Symbol* _int = popSymbol(); + if (array_declare_list->size <= 0) + outputError(string("语法错误:第") + to_string(lineCount) + "行,数组" + ID->name + "容量不合法"); + + for(int i=0;isize;i++){ + string name = ID->name+"_"+to_string(i); + varTable.push_back(Var{ name,D_INT,nowLevel }); + } + pushSymbol(new Symbol(reductPro.left)); + break; + } + case 53://array_declare_list ::= array_declare array_declare_list + { + ArrayDeclareList* array_declare_list = (ArrayDeclareList*)popSymbol(); + ArrayDeclare* array_declare = (ArrayDeclare*)popSymbol(); + ArrayDeclareList* total_list = new ArrayDeclareList(reductPro.left); + total_list->size = array_declare->size * array_declare_list->size; + pushSymbol(total_list); + break; + } + case 54://array_declare_list ::= array_declare ; + { + Symbol* semi = popSymbol(); + ArrayDeclare* array_declare = (ArrayDeclare*)popSymbol(); + ArrayDeclareList* total_list = new ArrayDeclareList(reductPro.left); + total_list->size = array_declare->size; + pushSymbol(total_list); + break; + } + case 55://array_declare ::= [ NUM ] + { + Symbol* rbracket = popSymbol(); + Num* num = (Num*)popSymbol(); + Symbol* lbracket = popSymbol(); + ArrayDeclare* array_declare = new ArrayDeclare(reductPro.left); + array_declare->size = atoi(num->number.c_str()); + pushSymbol(array_declare); + break; + } + case 56://assign_sentence ::= array = expression ; + { + Symbol* comma = popSymbol(); + Expression* expression = (Expression*)popSymbol(); + Symbol* assign = popSymbol(); + Id* ID = (Id*)popSymbol(); + Symbol* assign_sentence = new Symbol(reductPro.left); + code.emit("=", expression->name, "_", ID->name); + pushSymbol(assign_sentence); + break; + } + case 57://factor ::= array + { + break; + } + case 58://array ::= ID [ expression ] + { + break; + } + case 59://array ::= array [ expression ] + { + break; + } default: for (int i = 0; i < popSymNum; i++) { popSymbol(); diff --git a/ParserAndSemanticAnalyser.h b/ParserAndSemanticAnalyser.h index acc53e5..95b8b1d 100644 --- a/ParserAndSemanticAnalyser.h +++ b/ParserAndSemanticAnalyser.h @@ -67,6 +67,18 @@ class ParameterList :public Symbol { ParameterList(const Symbol& sym); }; +class ArrayDeclare :public Symbol { +public: + int size; + ArrayDeclare(const Symbol& sym); +}; + +class ArrayDeclareList :public Symbol { +public: + int size; + ArrayDeclareList(const Symbol& sym); +}; + class SentenceBlock :public Symbol { public: listnextList; diff --git a/productions.txt b/productions.txt index d68feed..7b25b24 100644 --- a/productions.txt +++ b/productions.txt @@ -49,4 +49,12 @@ factor ::= ID ( argument_list ) factor ::= ID argument_list ::= argument_list ::= expression -argument_list ::= expression , argument_list \ No newline at end of file +argument_list ::= expression , argument_list +declare ::= int ID array_declare_list +array_declare_list ::= array_declare array_declare_list +array_declare_list ::= array_declare +array_declare ::= [ NUM ] +assign_sentence ::= array = expression ; +factor ::= array +array ::= ID [ expression ] +array ::= array [ expression ] \ No newline at end of file diff --git a/productions_with_array.txt b/productions_with_array.txt new file mode 100644 index 0000000..db61667 --- /dev/null +++ b/productions_with_array.txt @@ -0,0 +1,30 @@ +Program ::= <声明串> +<声明串> ::=<声明>{<声明>} +<声明> ::=int <声明类型> | void <函数声明> +<声明类型>::=<变量声明> | <函数声明> | <数组声明> +<变量声明> ::= ; +<函数声明> ::= ‘(’<形参>‘)’ <语句块> +<数组声明> ::= ‘[’ (数字)+ ‘]’{‘[’ (数字)+ ‘]’} +<形参>::= <参数列表> | void +<参数列表> ::= <参数> {, <参数>} +<参数> ::= int +<语句块> ::= ‘{’<内部声明> <语句串>‘}’ +<内部声明> ::= 空 | <内部变量声明>;{<内部变量声明>;} +// TODO:内部变量声明是不是没有包括数组结构啊 +<内部变量声明>::=int +<语句串> ::= <语句>{ <语句> } +<语句> ::= |< while语句> | | <赋值语句> +<赋值语句> ::= ‘=’<表达式> | <数组>‘=’<表达式>; + ::= return [ <表达式> ] ;(注:[ ]中的项表示可选) + ::= while ‘( ’<表达式> ‘)’ <语句块> + ::= if ‘(‘<表达式>‘)’ <语句块> [ else <语句块> ](注:[ ]中的项表示可选) +<表达式>::=<加法表达式>{ relop  <加法表达式> }  (注:relop-> <|<=|>|>=|==|!=) +<加法表达式> ::= <项> {+ <项> | -<项>} +<项> ::= <因子> {* <因子> | /<因子>} +<因子> ::=num | ‘(’<表达式>‘)’ | FTYPE |<数组> +FTYPE ::= | 空 + ::=‘(’<实参> ‘) ’ +<数组>::= ‘[’<表达式>‘]’ | <数组> ‘[’<表达式>‘]’ +<实参> ::=<实参列表> | 空 +<实参列表> ::= <表达式>{, <表达式>}  +::=字母(字母|数字)* \ No newline at end of file diff --git a/productions_with_explanation.txt b/productions_with_explanation.txt index 904b4cf..909abad 100644 --- a/productions_with_explanation.txt +++ b/productions_with_explanation.txt @@ -9,8 +9,14 @@ declare_list ::= declare declare ::= int ID M A function_declare declare ::= void ID M A function_declare -// 全局变量 +// 变量定义 declare ::= int ID var_declare +declare ::= int ID array_declare_list + +// 数组声明 +array_declare_list ::= array_declare array_declare_list +array_declare_list ::= array_declare ; +array_declare ::= [ NUM ] // 嵌套层级+1 A ::= @@ -50,6 +56,7 @@ return_sentence ::= return expression ; // 赋值语句 sentence ::= assign_sentence assign_sentence ::= ID = expression ; +assign_sentence ::= array = expression ; while_sentence ::= while M ( expression ) A sentence_block @@ -84,8 +91,12 @@ factor ::= NUM factor ::= ( expression ) factor ::= ID ( argument_list ) factor ::= ID +factor ::= array + +array ::= ID [ expression ] +array ::= array [ expression ] // 实参 argument_list ::= argument_list ::= expression -argument_list ::= expression , argument_list \ No newline at end of file +argument_list ::= expression , argument_list