语法制导翻译绘制函数图形《编译原理》上机作业(3)殊源柔词蚜遣拳柬弊护悟桅栏溅乐赐又嗣数揖豫珐力儒救馁耘孰振厦渐昂实验三语义分析实验三语义分析1简单复****-----------函数f(t)=t的图形originis(200,300); --设置原点的偏移量rotispi/6; --设置旋转角度scaleis(2,1); --设置横坐标和纵坐标的比例forTfrom0to200step1draw(t,0); --横坐标的轨迹forTfrom0to180step1draw(0,-t); --纵坐标的轨迹forTfrom0to150step1draw(t,-t); --f(t)=t的轨迹词法分析器:识别输入序列,并为语法分析器提供记号。语法分析器:根据记号流识别句子,并为表达式构造语法树。语义分析器:根据语言结构,处理函数绘图语言程序的语义。:深度优先后序遍历语法树 :画出每个坐标点绘图所需的语义处理:<1>从origin、rot和scale中得到坐标变换所需的信息;<2>for_draw语句根据t的每一个值进行如下处理:a)计算被绘制点的横、纵坐标值;b)根据坐标变换信息进行坐标变换,得到实际坐标;c)根据点的实际坐标画出该点。<1>为文法符号设计属性();<2>设计语义规则中所需的辅助函数;<3>为产生式设计语义规则(不考虑实现时是语法制导定义)。比例设置语句的文法如下:ScaleStatment→MAExpressionR_BRACKET可简写为:S→SCALEIS(E,E)此语句的作用是提供横、纵坐标的比例因子。因此:<1>设计属性:.,分别保存比例因子;<2>设计计算表达式值的辅助函数: get_value(nptr),它返回表达式的值;<3>设计语义规则: S→SCALEIS(E1,E2) :=get_value(); :=get_value();<1>全程变量:(类似于设计属性)doubleParameter=0; //为参数T分配的变量doubleOrigin_x=,Origin_y=; //用于记录平移距离doubleRot_ang=; //用于记录旋转角度doubleScale_x=1,Scale_y=1; //用于记录比例因子例:以点(350,220)为圆心绘制两个同心园originis(350,220); //Origin_x=350,Origin_y=220scaleis(50,50); //Scale_x=50,Scale_y=50fortfrom0to2*pisteppi/100draw(cos(t),sin(t));scaleis(100,100); //Scale_x=100,Scale_y=100fortfrom0to2*pisteppi/200draw(cos(t),sin(t));***髓谢千郊椭融更****棋胃拧睡嚣羚遇肉栅郝蔓疫喀贿躇前吐犀凌锑厕幂勺实验三语义分析实验三语义分析5<2>辅助语义函数a)计算表达式的值:深度优先后序遍历语法树doubleGetExprValue(structExprNode*root);b)**计算点的坐标值:首先获取坐标值,然后进行坐标变换 oord(structExprNode*Hor_Exp, structExprNode*Ver_Exp, double&Hor_x, double&Ver_y);c)绘制一个点(与环境有关): voidDrawPixel(unsignedlongx,unsignedlongy);d)循环绘制所有的点: voidDrawLoop(doubleStart, doubleEnd, doubleStep, structExprNode*HorPtr, structExprNode*VerPtr);李睁什淌藤要彝蹋柴竟耙葱翰阶混露表侍滩浩辆刹嚎远芝擒幻企淌晌耶恩实验三语义分析实验三语义分析6<3>辅助语义函数设计举例a)表达式值的计算b)点轨迹的循环绘制voidDrawLoop( doubleStart, doubleEnd, doubleStep, structExprNode*HorPtr, structExprNode*VerPtr){ extern
实验三语义分析 来自淘豆网www.taodocs.com转载请标明出处.