?? semantics.cpp
字號:
// ----------------------------- semantics.cpp ---------------------------------
// 函數(shù)繪圖類的定義
#include "semantics.h"
// ------------------------ 出錯處理
void semantics_class::Errmsg (char *string) { exit (1); }
void semantics_class::error_msg(int line, char * descrip, char * string)
{
const int buf_len=256;
char msg[buf_len];
memset(msg, 0, buf_len);
sprintf(msg, "Line No %3d: %s %s !", Scanner.line_no, descrip, string);
MessageBox(NULL, msg, "error!", MB_OK);
Scanner.close_scanner();
exit(1);
}
// ------------------------ 計算被繪制點的坐標(biāo)
void semantics_class::cal_coord(tree_node_ptr x_ptr,
tree_node_ptr y_ptr,
double &x_ret,
double &y_ret)
{
double x_val, x_temp, y_val;
// 計算表達(dá)式的值,得到點的原始坐標(biāo)
x_val = get_tree_value(x_ptr);
y_val = get_tree_value(y_ptr);
// 比例變換
x_val *= Scale_x ;
y_val *= Scale_y ;
// 旋轉(zhuǎn)變換
x_temp = x_val*cos(rot_angle) + y_val*sin(rot_angle);
y_val = y_val*cos(rot_angle) - x_val*sin(rot_angle);
x_val = x_temp;
// 平移變換
x_val += Origin_x;
y_val += Origin_y;
// 返回變換后點的坐標(biāo)
x_ret = x_val;
y_ret = y_val;
}
// ------------------------ 循環(huán)繪制點坐標(biāo)
void semantics_class::draw_loop
( double start_val,
double end_val,
double step_val,
tree_node_ptr x_ptr,
tree_node_ptr y_ptr)
{
double x_val, y_val;
for(parameter = start_val; parameter <= end_val; parameter += step_val)
{ cal_coord(x_ptr, y_ptr, x_val, y_val);
// y_val = 460-y_val; // 修改顯示屏的直角坐標(biāo)系
draw_pixel((unsigned long)x_val, (unsigned long)y_val);
}
}
// ------------------------ 計算表達(dá)式的值
double semantics_class::get_tree_value(tree_node_ptr root)
{
if (root == NULL) return 0.0;
switch (root -> op_code)
{ case PLUS :
return get_tree_value(root->content.tag_op.left ) +
get_tree_value(root->content.tag_op.right) ;
case MINUS :
return get_tree_value(root->content.tag_op.left ) -
get_tree_value(root->content.tag_op.right) ;
case MUL :
return get_tree_value(root->content.tag_op.left ) *
get_tree_value(root->content.tag_op.right) ;
case DIV :
return get_tree_value(root->content.tag_op.left ) /
get_tree_value(root->content.tag_op.right) ;
case POWER :
return pow(get_tree_value(root->content.tag_op.left ),
get_tree_value(root->content.tag_op.right) );
case FUNC :
return (* root->content.tag_func.math_func_ptr)
(get_tree_value(root->content.tag_func.child) );
case CONST_ID :
return root->content.tag_const ;
case T :
return *(root->content.tag_parameter);
default :
return 0.0 ;
}
}
// ------------------------ 刪除一棵語法樹
void semantics_class::delete_tree(tree_node_ptr root)
{
if (root == NULL) return;
switch (root -> op_code)
{ case PLUS : // 兩個孩子的內(nèi)部節(jié)點
case MINUS :
case MUL :
case DIV :
case POWER :
delete_tree (root->content.tag_op.left ) ;
delete_tree (root->content.tag_op.right) ;
break ;
case FUNC : // 一個孩子的內(nèi)部節(jié)點
delete_tree (root->content.tag_func.child) ;
break ;
default : // 葉子節(jié)點
break ;
}
delete(root) ; // 刪除節(jié)點
}
// ------------------------ 繪制一個點
void semantics_class::draw_pixel(unsigned long x, unsigned long y)
{
if (line_color==red_color) {
SetPixel(hDC, x, y, red());
SetPixel(hDC, x+1, y, red());
SetPixel(hDC, x, y+1, red());
SetPixel(hDC, x+1, y+1, red());
}
else {
SetPixel(hDC, x, y, black());
SetPixel(hDC, x+1, y, black());
SetPixel(hDC, x, y+1, black());
SetPixel(hDC, x+1, y+1, black());
}
}
// ------------------------ origin_statement的遞歸子程序
void semantics_class::origin_statement()
{
parser_class::origin_statement(); // 語法分析獲取語法樹(由parser中的屬性保存)
Origin_x = get_tree_value(x_ptr); // 根據(jù)語法樹計算橫坐標(biāo)的平移距離
delete_tree(x_ptr);
Origin_y = get_tree_value(y_ptr); // 根據(jù)語法樹計算縱坐標(biāo)的平移距離
delete_tree(y_ptr);
}
// ------------------------ scale_statement的遞歸子程序
void semantics_class::scale_statement ()
{
parser_class::scale_statement(); // 語法分析獲取語法樹(由parser中的屬性保存)
Scale_x = get_tree_value(x_ptr); // 根據(jù)語法樹計算橫坐標(biāo)的比例因子
delete_tree(x_ptr);
Scale_y = get_tree_value(y_ptr); // 根據(jù)語法樹計算縱坐標(biāo)的比例因子
delete_tree(y_ptr);
}
// ------------------------ rot_statement的遞歸子程序
void semantics_class::rot_statement ()
{
parser_class::rot_statement(); // 語法分析獲取語法樹(由parser中的屬性保存)
rot_angle = get_tree_value(angle_ptr); // 根據(jù)語法樹計算旋轉(zhuǎn)角度
delete_tree(angle_ptr);
}
// ------------------------ for_statement 的遞歸子程序
void semantics_class::for_statement ()
{
double start_val, end_val, step_val; // 繪圖起點、終點、步長
parser_class::for_statement(); // 語法分析獲取各表達(dá)式的語法樹(由parser中的屬性保存)
start_val = get_tree_value(start_ptr); // 計算起點表達(dá)式的值
end_val = get_tree_value(end_ptr); // 計算終點表達(dá)式的值
step_val = get_tree_value(step_ptr); // 計算步長表達(dá)式的值
draw_loop (start_val, end_val, step_val, x_ptr, y_ptr); // 繪圖
delete_tree(start_ptr); // 釋放空間
delete_tree(end_ptr);
delete_tree(step_ptr);
delete_tree(x_ptr);
delete_tree(y_ptr);
}
// ---------------------- 用于語法分析器中的跟蹤調(diào)試, 此處不再起作用
void semantics_class::enter() {}
void semantics_class::back() {}
void semantics_class::call_match() {}
void semantics_class::tree_trace() {}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -