@@ -16,6 +16,7 @@ static void ast::Init()
1616 Function* div = new Function (BuiltinFunc::hasTwoSonNodes, BuiltinFunc::div,2 );
1717 Function* pow = new Function (BuiltinFunc::hasTwoSonNodes, BuiltinFunc::pow,2 );
1818 Function* sin = new Function (BuiltinFunc::hasOneSonNode, BuiltinFunc::sin,1 );
19+ Function* cos = new Function (BuiltinFunc::hasOneSonNode, BuiltinFunc::cos,1 );
1920 Function* log = new Function (BuiltinFunc::hasTwoSonNodes, BuiltinFunc::log, 2 );
2021 // 将这些函数置入函数域
2122 record::globalScope.addFunction (" +" ,add);
@@ -24,6 +25,7 @@ static void ast::Init()
2425 record::globalScope.addFunction (" /" ,div);
2526 record::globalScope.addFunction (" ^" ,pow);
2627 record::globalScope.addFunction (" sin" ,sin);
28+ record::globalScope.addFunction (" cos" ,cos);
2729 record::globalScope.addFunction (" log" , log);
2830 // Function* entity=runtime::globalScope.functionList["+"]; //在parse阶段,可以这样从函数域中找到函数名对应的函数实体
2931 // FunNode* testNode=new FunNode(entity); //然后这样通过函数实体创建相应的函数节点
@@ -58,7 +60,7 @@ bool ast::canpush(stack<string> &stackOp, const string& op)
5860
5961BasicNode* ast::__ToAST (string &s)
6062{
61- s += ' $ ' ;
63+ s += LowestPriority ;
6264 stack<BasicNode*> stackAST;
6365 stack<string> stackOp;
6466 int n = s.size ();
@@ -69,23 +71,23 @@ BasicNode* ast::__ToAST(string &s)
6971 int j = i;
7072
7173 if ((s[j] == ' +' || s[j] == ' -' ) && (j == 0 || isBinOp (s[j - 1 ])))
72- {
74+ {
7375 j++;
7476 }// 检查负号还是减号
7577 if (j < n && isNum (s[j]))
7678 {
7779 while (j < n && isNum (s[j]))
7880 j++;// 整数部分
79- if (s[j] == ' .' && j + 1 < n && isNum (s[j + 1 ])) {
81+ if (s[j] == ' .' && j + 1 < n && isNum (s[j + 1 ])) {
8082 j++;// 小数部分
8183 while (j < n && isNum (s[j + 1 ]))
8284 {
8385 j++;
8486 }
85- }
86- temp += s.substr (i,j-i);
87- i = j;
88- stackAST.push (new NumNode (stod (temp)));
87+ }
88+ temp += s.substr (i,j-i);
89+ i = j;
90+ stackAST.push (new NumNode (stod (temp)));
8991 }
9092
9193 else if (j < n && isLetter (s[j]))
@@ -94,18 +96,18 @@ BasicNode* ast::__ToAST(string &s)
9496 j++;
9597 if (j < n && s[j] == ' (' )// 函数
9698 {
97- FunNode* node = new FunNode (record::globalScope.functionList [s.substr (i, j - i)]);
98- // 此时s[j] == '('
99- while (s[j] != ' )' && s[j] != LowestPriority)
100- {
101- i = j;
102- j++;
99+ FunNode* node = new FunNode (record::globalScope.functionList [s.substr (i, j - i)]);
100+ // 此时s[j] == '('
101+ while (s[j] != ' )' && s[j] != LowestPriority)
102+ {
103+ i = j;
104+ j++;
103105 while (j < n && s[j] != ' ,' && s[j] != ' )' && s[j] != LowestPriority)
104106 j++;
105107 node->addNode (ToAST (s.substr (i + 1 , j - i - 1 )));
106- }
107- stackAST.push (node);
108- i = j + 1 ;
108+ }
109+ stackAST.push (node);
110+ i = j + 1 ;
109111 }
110112
111113 else // 变量
@@ -136,13 +138,13 @@ BasicNode* ast::__ToAST(string &s)
136138
137139 if (i < n && (isBinOp (s[i]) || s[i] == LowestPriority))// 按理说,一个数字/变量/函数结束之后是一个运算符/字符串结尾
138140 {
139- if (canpush (stackOp, s.substr (i,1 )))
140- {
141+ if (canpush (stackOp, s.substr (i,1 )))
142+ {
141143 stackOp.push (s.substr (i,1 ));
142- }
143- else {
144- while (!canpush (stackOp, s.substr (i,1 )))
145- {
144+ }
145+ else {
146+ while (!canpush (stackOp, s.substr (i,1 )))
147+ {
146148 BasicNode* a = stackAST.top ();
147149 stackAST.pop ();
148150 BasicNode* b = stackAST.top ();
@@ -159,7 +161,7 @@ BasicNode* ast::__ToAST(string &s)
159161 }
160162 else
161163 {
162- throw string (" Error string" );
164+ throw string (" Error string" );
163165 }
164166
165167 }
0 commit comments