




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验二 算数表达式解释器的设计与实现一. 实验目的1. 了解并掌握自顶向下语法分析的思想,熟悉递归下降子程序分析法。2. 了解并掌握语法制导翻译法,掌握采用递归子程序进行语义分析的方法。二. 实验内容 用适当的程序设计语言编制一个算术表达式的解释器,并完成相应的调试,要求该程序能够读入一个算术表达式,运行后给出计算的结果。1算术表达式的解释过程(参考)第一步:首先进行词法分析(即使用实验一编制的词法分析器),提取最终得到的结果单词符号序列,将其作为语法和语义分析的输入;第二步:调用算术表达式的语法及语义分析器。本次实验要求采用递归下降子程序法编写语法分析器,其中要包含对语义的分析。分析结束后,显示表达式的计算结果。2使用的文法E TE E +TE |e T FT T *FT|e Fi(E)其中i为整数(最简单的情况),如果考虑周全的话,i可取实数类型(需要看一下自己编制的词法分析器是否对实数进行了识别)。该文法的递归下降子程序见书中74页。3. 有能力的同学在完成加乘算术表达式的计算后,试扩充文法,增加识别减法和除法的规则,并修改对应的程序,使之能够识别并计算加减乘除四则运算式。三. 实验要求1. 程序完成后,由实验老师检查代码,验证程序的功能。如:输入 (2+3)*10 对文法进行扩充的,输入 (12-8)*20/5+4等等。 2. 实验二共4学时,实验完成后,提交一份实验报告,写清实验的类型、目的、内容、思路、设计及实现的过程(包括关键的代码,不宜多),以及实验的结果。实验类型为设计型实验。四. 实验代码using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication5 public partial class Form1 : Form public Form1() InitializeComponent(); private void button1_Click(object sender, EventArgs e) string str = textBox1.Text; int sum= Calculate(str); textBox2.Text = Convert.ToString(sum); public int Calculate(string Expression) List numList = new List();/数字列表 List OperatorList = new List();/运行符列表 bool numState = true;/true:刚遇到符号 int num = 0; Expression = getExpressionNoBrackets(Expression);/读取括号情况 char expression = Expression.ToCharArray(); for (int i = 0; i 58|Convert.ToInt16(expressioni) 48) switch (expressioni) case +: numState = true; numList.Add(num); break; case -: numState = true; numList.Add(num); break; case *: numState = true; numList.Add(num); break; case /: numState = true; numList.Add(num); break; default: throw new Exception(运算符错误,无法识别); OperatorList.Add(expressioni); else if (numState) num = Convert.ToInt16(expressioni.ToString(); if (i = expression.Length - 1) numList.Add(num); numState = false; else num*=10;num+= Convert.ToInt16(expressioni.ToString(); if (i = expression.Length - 1) numList.Add(num); return getResults(numList, OperatorList); public int getResults(List numList, List OperatorList) if (numList.Count = 1) return numList0; List numList1 = new List(); numList1.Add(numList0); List OperatorList1 = new List(); for (int i = 0; i OperatorList.Count; i+) if (OperatorListi = + | OperatorListi = -) numList1.Add(numListi + 1); OperatorList1.Add(OperatorListi); else if (OperatorListi = *) numList1numList1.Count - 1 *= numListi + 1; else if (OperatorListi = /) numList1numList1.Count - 1 /= numListi + 1; int results = numList10; for (int i = 0; i OperatorList1.Count; i+) if (OperatorList1i = +) results += numList1i + 1; else results -= numList1i + 1; return results; public string getExpressionNoBrackets(string Expression) List numList = new List();/数字列表 List OperatorList = new List();/运行符列表 char expression = Expression.Trim().ToCharArray(); #region 去除空格 Expression = ; for (int i = 0; i expression.Length; i+) if (expressioni != ) Expression += expressioni.ToString(); expression = Expression.ToCharArray(); #endregion 去除空格 int num = 0; int state = -1; bool numState = true; string ChildExpression = ; for (int i = 0; i 0) if (ChildExpression.Length = 0) ChildExpression += ; else ChildExpression += expressioni.ToString(); else if (state = 0) numList.Add(Calculate(ChildExpression);/递归,调用计算方法,计算方法又调用此方法。 else if (Convert.ToInt16(expressioni) 58 | Convert.ToInt16(expressioni) 48) switch (expressioni) case +: numState = true; numList.Add(num); break; case -: numState = true; numList.Add(num); break; case *: numState = true; numList.Add(num); break; case /: numState = true; numList.Add(num); break; default: throw new Exception(表达式不正确,含有未知字符!); OperatorList.Add(expressioni); else if (numState) num = Convert.ToInt16(expressioni.ToString(); if (i = expression.Length - 1) numList.Add(num); numState = false; else num*=10;num+= Convert.ToInt16(expressioni.ToString(); if (i = expression.Length - 1) numList.Add(num); if (numList.Count - OperatorList.Count
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年社会心理服务专业考试卷及答案
- 2025年院感染预防与控制知识试题与答案
- 2025年抗菌药物培训试题(答案)
- 绵阳市2025公需科目考试题库(含答案)
- 2025年输血科消毒试题及答案
- 2025年驾校安全文明驾驶试题(附答案)
- 2025年建筑工程师执业资格考试试题及答案
- 2025年中国职工保险互助会陕西办事处招聘考试笔试试题带答案
- 2025年手术室试题及答案
- 2025年大数据技术与应用考试试卷及答案
- 住房供给调控预案
- 培训行业转介绍
- 文科物理(兰州大学)学习通网课章节测试答案
- 人教版高二数学(上)选择性必修第一册1.2空间向量基本定理【教学设计】
- catia考试图纸题目及答案
- pos机风险管理办法
- 2025年行业机器人边缘计算技术应用与场景分析
- 2025年安徽省公务员录用考试《行测》真题及答案
- 山河已无恙+吾辈当自强+课件-2025-2026学年高二上学期用《南京照相馆》和731上一节思政课
- 中国兽药典三部 2020年版
- GB/T 7193-2008不饱和聚酯树脂试验方法
评论
0/150
提交评论