Skip to content

Commit

Permalink
sync
Browse files Browse the repository at this point in the history
  • Loading branch information
qihaoyu committed May 14, 2021
1 parent e4e099b commit 6f6fb55
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 3 deletions.
2 changes: 2 additions & 0 deletions ObjectCodeGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,10 +125,12 @@ string ObjectCodeGenerator::allocateReg() {
}
}
}
// 不存在变量仅存储在寄存器中且未来会当作源操作数引用,直接用该寄存器
if (nextpos == inf) {
ret = iter->first;
break;
}
// 更新maxNextPos查找引用位置最远的寄存器
else if (nextpos > maxNextPos) {
maxNextPos = nextpos;
ret = iter->first;
Expand Down
70 changes: 70 additions & 0 deletions ParserAndSemanticAnalyser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {}
Expand Down Expand Up @@ -1036,6 +1040,72 @@ void ParserAndSemanticAnalyser::analyse(list<Token>&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;i<array_declare_list->size;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();
Expand Down
12 changes: 12 additions & 0 deletions ParserAndSemanticAnalyser.h
Original file line number Diff line number Diff line change
Expand Up @@ -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:
list<int>nextList;
Expand Down
10 changes: 9 additions & 1 deletion productions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,12 @@ factor ::= ID ( argument_list )
factor ::= ID
argument_list ::=
argument_list ::= expression
argument_list ::= expression , argument_list
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 ]
30 changes: 30 additions & 0 deletions productions_with_array.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
Program ::= <声明串>
<声明串> ::=<声明>{<声明>}
<声明> ::=int <ID> <声明类型> | void <ID> <函数声明>
<声明类型>::=<变量声明> | <函数声明> | <数组声明>
<变量声明> ::= ;
<函数声明> ::= ‘(’<形参>‘)’ <语句块>
<数组声明> ::= ‘[’ (数字)+ ‘]’{‘[’ (数字)+ ‘]’}
<形参>::= <参数列表> | void
<参数列表> ::= <参数> {, <参数>}
<参数> ::= int <ID>
<语句块> ::= ‘{’<内部声明> <语句串>‘}’
<内部声明> ::= 空 | <内部变量声明>;{<内部变量声明>;}
// TODO:内部变量声明是不是没有包括数组结构啊
<内部变量声明>::=int <ID>
<语句串> ::= <语句>{ <语句> }
<语句> ::= <if语句> |< while语句> | <return语句> | <赋值语句>
<赋值语句> ::= <ID>‘=’<表达式> | <数组>‘=’<表达式>;
<return语句> ::= return [ <表达式> ] ;(注:[ ]中的项表示可选)
<while语句> ::= while ‘( ’<表达式> ‘)’ <语句块>
<if语句> ::= if ‘(‘<表达式>‘)’ <语句块> [ else <语句块> ](注:[ ]中的项表示可选)
<表达式>::=<加法表达式>{ relop  <加法表达式> }  (注:relop-> <|<=|>|>=|==|!=)
<加法表达式> ::= <项> {+ <项> | -<项>}
<项> ::= <因子> {* <因子> | /<因子>}
<因子> ::=num | ‘(’<表达式>‘)’ |<ID> FTYPE |<数组>
FTYPE ::= <call> | 空
<call> ::=‘(’<实参> ‘) ’
<数组>::=<ID> ‘[’<表达式>‘]’ | <数组> ‘[’<表达式>‘]’
<实参> ::=<实参列表> | 空
<实参列表> ::= <表达式>{, <表达式>} 
<ID>::=字母(字母|数字)*
15 changes: 13 additions & 2 deletions productions_with_explanation.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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 ::=
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
argument_list ::= expression , argument_list

0 comments on commit 6f6fb55

Please sign in to comment.