欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    [计算机软件及应用]编译原理计算器报告.doc

    • 资源ID:1992061       资源大小:180.67KB        全文页数:37页
    • 资源格式: DOC        下载积分:6
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要6
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    [计算机软件及应用]编译原理计算器报告.doc

    编译原理课程设计2一、 题目:计算器设计(运用词法分析&语法分析方法)二、 运行环境:JAVA jdk1.6.0_21 三、 设计思路:1、为每种可能识别出来的合法单词创建一个类,类的属性包括该单词的各别码及值。2、构建异常类,以实现计算器的容错性能。3、构建一个词法分析类,用之提取单词。4、构建表达式中各单词间的优先关系表。5、构建一个语法分析类,对表达式进行规约。此类调用词法类获取单词,查询优先关系表进行规约操作。6、构建一个计算类,调用语法分析类以实现计算。7、构建一个GUI类,设计好操作界面,并内置计算类,以实现界面操作计算功能。系统总体调用关系视图如下:四、 基本工具UML及JAVA语言五、 程序源代码:1、 实现GUI的mainWindow类代码package gui;import parser.Calculator;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.text.*;public class mainWindow /extends JFrame JFrame mainFrame; JTextField inputField; JTextField outputField; JButton button = new JButton30; String s="7","8","9","4","5","6","1","2","3","0",".","=","backspace","c","+","","e","+/-","-","sqrt","sin","cos","*","&","|","","/","%","(",")" int i; JPanel p1,p2,p3,p4,p5,p6,p7,p8; JLabel l1,l2; JMenuBar menubar; JMenuItem item1,item2,item3,item4,item5,item6,item7; public void display() mainFrame = new JFrame("计算器2010 Beta1"); mainFrame.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) int i = JOptionPane.showConfirmDialog(null,"是否确定退出系统","退出确认对话框",JOptionPane.YES_NO_CANCEL_OPTION);if (i = 0) System.exit(0); ); mainFrame.getContentPane().setLayout(new BorderLayout(); mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); JPanel ioPanel = new JPanel(); mainFrame.getContentPane().add(ioPanel); mainFrame.add(ioPanel); ioPanel.setLayout(new BorderLayout(); menubar = new JMenuBar(); mainFrame.setJMenuBar(menubar); JMenu menu1 = new JMenu("编辑"); JMenu menu2 = new JMenu("操作"); JMenu menu3 = new JMenu("帮助"); menubar.add(menu1); menubar.add(menu2); menubar.add(menu3); item1 = new JMenuItem("复制",'C'); item2 = new JMenuItem("粘贴",'V'); item3 = new JMenuItem("剪切",'X'); item4 = new JMenuItem("计算",'G'); item5 = new JMenuItem("清空所有",'R'); item6 = new JMenuItem("退出",'Q'); item7 = new JMenuItem("关于计算器",'H'); menu1.add(item1); menu1.add(item2); menu1.add(item3); menu2.add(item4); menu2.add(item5); menu2.addSeparator(); menu2.add(item6); menu3.add(item7); /给菜单项注册监听器 item1.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) outputField.setEnabled(true);outputField.selectAll();outputField.copy();outputField.setEnabled(false); ); item2.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) inputField.setText("");inputField.paste(); ); item3.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) inputField.selectAll();inputField.cut(); ); item4.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) button11.doClick(); ); item5.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) inputField.setText(""); outputField.setText(""); ); item6.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) int i = JOptionPane.showConfirmDialog(null,"是否确定退出系统","退出确认对话框",JOptionPane.YES_NO_CANCEL_OPTION);if (i = 0) System.exit(0); ); item7.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) JOptionPane.showMessageDialog(mainFrame, getHelpMessage(); ); Font font = new Font("Arial",Font.BOLD,24); l1 = new JLabel("算术表达式:"); l2 = new JLabel("计算结果:"); inputField = new JTextField(30); inputField.setFont(font); inputField.addKeyListener(new KeyAdapter() public void keyPressed(KeyEvent ev) if (ev.getKeyChar() = KeyEvent.VK_ENTER) button11.doClick();); outputField = new JTextField(30); outputField.setFont(font); outputField.setEnabled(false); p3 = new JPanel(new FlowLayout(); p4 = new JPanel(new FlowLayout(); p1 = new JPanel(new GridLayout(2,2,10,10); p3.add(l1); p3.add(inputField); p4.add(l2); p4.add(outputField); p1.add(p3); p1.add(p4); ioPanel.add(p1,"North"); p2 = new JPanel(new GridLayout(1,2,20,10); p5 = new JPanel(new BorderLayout(); p6 = new JPanel(new GridLayout(4,3,10,10); p7 = new JPanel(new FlowLayout(); p8 = new JPanel(new GridLayout(4,4,10,10); p2.add(p5); p2.add(p8); p5.add(p6,"Center"); p5.add(p7,"South"); Font fontb = new Font("Arial",Font.BOLD,15); for(i=0;i<12;i+) buttoni=new JButton(si); buttoni.setFont(fontb); buttoni.addActionListener(new Act(); p6.add(buttoni); for(i=12;i<14;i+) buttoni=new JButton(si); buttoni.setFont(fontb); buttoni.addActionListener(new Act(); p7.add(buttoni); for(i=14;i<30;i+) buttoni=new JButton(si); buttoni.setFont(fontb); buttoni.addActionListener(new Act(); p8.add(buttoni); ioPanel.add(p2,"Center"); mainFrame.setSize(730,400); mainFrame.setVisible(true); class Act implements ActionListener public void actionPerformed(ActionEvent e) if(e.getActionCommand()="c") inputField.setText(""); outputField.setText(""); else if(e.getActionCommand()="backspace") if(inputField.getText().length()>0) inputField.setText(inputField.getText().substring(0,inputField.getText().length()-1); else if(e.getActionCommand()="+/-") getResult(); String ss = outputField.getText(); if (Character.isDigit(ss.charAt(0) outputField.setText("-"+ss); else if (ss.charAt(0) = '-') outputField.setText(ss.substring(1); else if(e.getActionCommand()="=") getResult(); else inputField.setText(inputField.getText()+e.getActionCommand(); public void getResult() try Calculator calculator = new Calculator(); double result = calculator.calculate(inputField.getText().trim(); /String str = String.valueof(result); outputField.setText(""+result); catch (Exception ex) outputField.setText(ex.getMessage(); String getHelpMessage() String msg = "" msg += "ttCopyright(C) 2009n" msg += "tt20072341 && 20072343n" return msg; 2、 计算类Calculatorpackage parser;import exceptions.*;public class Calculator public double calculate(String expression) throws ExpressionException Parser parser = new Parser(expression+"#"); parser.guiyue(); return parser.result; 3、 Parser语法类package parser;/*parser类主要实现语法分析和语义分析。对经过词法分析的表达式进行计算,并抛出相应异常。*/import exceptions.*;import java.util.*;import parser.*;import java.math.*;import symbol.*;public class Parser public double result = 0; Opp_table table = new Opp_table(); ArrayList<Token> stack = new ArrayList<Token>(); Scan scanner; int index = 0; public Parser(String temp) scanner = new Scan(temp); stack.add(new Pound(); /*push实现压栈操作*/ public void push(Token temp) if (temp.getType()!=15) index+; stack.add(temp); /*double_to_int将double型数值转为int型*/ public int double_to_int(double t) String s1 = String.valueOf(t); String s2 = s1.substring(0,s1.indexOf("."); int i = Integer.parseInt(s2);return i; /*一元操作 sqrt sin cos */ public void unary(Token temp) throws SqrtException, ExpressionException Token t; double tt; int tt2; t = stack.get(index); stack.remove(index); index-; tt = temp.get_value(); tt2 = double_to_int(tt); switch (t.getType() case 8: tt = (double)(tt2); break; case 10: if (tt<0) throw new SqrtException(); tt = Math.sqrt(tt); break; case 11: tt = Math.sin(tt); break; case 12: tt = Math.cos(tt); break; default: throw new ExpressionException(); temp.set_value(tt); push(temp); /*二元操作 + - * / & | % */ public void binary() throws DividedByZeroException, ExpressionException Token t1,t2,t3; double tt1,tt2,tt3; int ttt1,ttt2,ttt3; t3 = stack.get(index);/取第二个操作数 stack.remove(index); index-; tt3 = t3.get_value(); ttt3 = double_to_int(tt3); t2 = stack.get(index);/取操作符 stack.remove(index); index-; t1 = stack.get(index);/取第一个操作数 stack.remove(index); index-; tt1 = t1.get_value(); ttt1 = double_to_int(tt1); switch (t2.getType() case 1: tt2 = tt1+tt3; break; case 2: tt2 = tt1-tt3; break; case 3: tt2 = tt1*tt3; break; case 4: if (tt3 = 0.0) throw new DividedByZeroException(); tt2 = tt1/tt3; break; case 5: tt2 = Math.pow(tt1,tt3); break; case 6: ttt2 = ttt1&ttt3; tt2 = (double)ttt2; break; case 7: ttt2 = ttt1|ttt3; tt2 = (double)ttt2; break; case 9: tt2 = tt1%tt3; break; default: throw new ExpressionException(); t1.set_value(tt2); push(t1); /*括号操作 () (i) (2+6) */ public void bracket() throws SqrtException, DividedByZeroException, ExpressionException int w; Token t1,t2; t1 = stack.get(index); stack.remove(index); index-; if (t1.getType() = 13) return; t2 = stack.get(index); stack.remove(index); index-; if (t1.getType() = 0 && t2.getType() != 13) push(t2); push(t1);do binary(); t2 = stack.get(index-1); if (t2.getType() = 13) break; while( true ); t1 = stack.get(index); stack.remove(index); index-; stack.remove(index); index-; push(t1); do t1 = stack.get(index); t2 = stack.get(index-1); w = t2.getType(); if (w = 8|w =10 | w=11 | w=12) stack.remove(index); index-; unary(t1); else break; while (true); else if(t1.getType() = 0 && t2.getType() = 13) push(t1); do t1 = stack.get(index); t2 = stack.get(index-1); w = t2.getType(); if (w = 8|w =10 | w=11 | w=12) stack.remove(index); index-; unary(t1); else break; while (true); /*接受操作 + - * / & | % # 返回1表示规约结束 成功 返回2表示已在栈中的优先级高 并且已经规约 返回3表示已在栈中的优先级低 */ public int accept(Token temp) throws DividedByZeroException, ExpressionException Token t1; int i,num1,num2; i = index - 1; t1 = stack.get(i); num1 = t1.getType(); num2 = temp.getType(); i = table.table2num1num2; if (i = 6) return 1; else if (i =-1) binary(); return 2; else if (i = 1) return 3; else throw new ExpressionException(); /*guiyue函数实现规约操作,通过比较已读入的数据和要读入的数据的优先*关系进行对应于表的规约 */ public void guiyue() throws SqrtException,EmptyExpressionException,DividedByZeroException,ExpressionException int num1,num2,i,tt,flag1;Token t1,t2;flag1 = 0;while (true) t2 = scanner.getnextToken();/取下一单词 num2 = t2.getType(); t1 = stack.get(index); num1 = t1.getType(); i = table.tablenum1num2; switch(i) case 0: push(t2); break;case 1: unary(t2); /应取下一单词 break;case 3: bracket(); /应取下一单词 break;case 4: tt = 2; while (tt = 2) tt = accept(t2); if (tt = 1) flag1 = 1; /标志规约成功 else push(t2); break;default: throw new ExpressionException(); /switch if (flag1 = 1) t1 = stack.get(index);result = t1.get_value();break; /while (true) /guiyue/类Parser4、 优先关系表类package parser;/*OPP算符优先关系表类*/public class Opp_table static int table = /* digit + - * / & | % sqrt sin cos ( ) # */ /*digit*/-1, 4, 4, 4, 4, 4, 4, 4, -1, 4, -1, -1, -1, -1, 3, 4, /* + */ 0, -1, -1,-1,-1,-1,-1,-1,0,-1, 0, 0, 0, 0, -1,-1, /*-*/ 0, -1, -1,-1,-1,-1,-1,-1,0, -1, 0, 0, 0, 0, -1,-1, /* * */ 0, -1,-1,-1,-1,-1,-1,-1, 0, -1, 0, 0, 0, 0,-1,-1, /* / */0,-1,-1,-1,-1,-1,-1,-1,0,-1,0,0,0,0,-1,-1, /* */0,-1,-1,-1,-1,-1,-1,-1,0,-1,0,0,0,0,-1,-1, /* & */0,-1,-1,-1,-1,-1,-1,-1,0,-1,0,0,0,0,-1,-1, /* | */0,-1,-1,-1,-1,-1,-1,-1,0,-1,0,0,0,0,-1,-1, /* */1,-1,-1,-1,-1,-1,-1,-1,0,-1,0,0,0,0,-1,-1, /* % */0,-1,-1,-1,-1,-1,-1,-1,0,-1,0,0,0,0,-1,-1, /* sqrt */1,-1,-1,-1, -1,-1,-1,-1,0,-1,0,0,0,0,-1,-1, /* sin */1,-1,-1,-1,-1,-1,-1,-1,0,-1,0,0,0,0,-1,-1, /* cos */1,-1,-1,-1,-1,-1,-1,-1,0,-1,0,0,0,0,-1,-1, /* ( */0,-1,-1,-1,-1,-1,-1,-1,0,-1,0,0,0,0,-1,-1, /* ) */-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* # */0,-1,-1,-1,-1,-1,-1,-1,0,-1,0,0,0,0,-1,4 ;/*在这二维关系表中,行代表栈中数据,列代表要读入的数据。即判断已读的和要读入的算符关系。*0代表压栈操作。*1代表一元操作,包括: sqrt sin cos。*-1代表表达式有误。*3代表括号操作,包括函数的判断以及执行。*4代表接受状态*/ static int table2 = /* digit + - * / & | % sqrt sin cos ( ) # */ /*digit*/5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, /* + */ 5,-1,-1,1,1,1,-1,-1,0,1,0,0,0,0,-1,-1, /*-*/ 5,-1,-1,1,1,1,-1,-1,0,1,0,0,0,0,-1,-1, /* * */ 5,-1,-1,-1,-1,1

    注意事项

    本文([计算机软件及应用]编译原理计算器报告.doc)为本站会员(音乐台)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开