00001 package plp;
00002
00003 import java.awt.Dimension;
00004 import java.awt.Toolkit;
00005 import java.awt.event.KeyEvent;
00006 import java.awt.event.KeyListener;
00007 import java.io.ByteArrayInputStream;
00008 import java.io.InputStream;
00009 import java.util.LinkedList;
00010 import java.util.List;
00011 import java.util.StringTokenizer;
00012
00013 import javax.swing.JButton;
00014 import javax.swing.JComboBox;
00015 import javax.swing.JFrame;
00016 import javax.swing.JLabel;
00017 import javax.swing.JPanel;
00018 import javax.swing.JScrollPane;
00019 import javax.swing.JTextArea;
00020 import javax.swing.JTextField;
00021
00022 import plp.expressions1.parser.Exp1Parser;
00023 import plp.expressions1.parser.ParseException;
00024 import plp.expressions2.expression.ValorBooleano;
00025 import plp.expressions2.expression.ValorInteiro;
00026 import plp.expressions2.expression.ValorString;
00027 import plp.expressions2.parser.Exp2Parser;
00028 import plp.functional1.parser.Func1Parser;
00029 import plp.functional2.parser.Func2Parser;
00030 import plp.imperative1.memory.ContextoCompilacaoImperativa;
00031 import plp.imperative1.memory.ContextoExecucaoImperativa;
00032 import plp.imperative1.memory.ListaValor;
00033 import plp.imperative1.parser.Imp1Parser;
00034 import plp.imperative2.memory.ContextoCompilacaoImperativa2;
00035 import plp.imperative2.memory.ContextoExecucaoImperativa2;
00036 import plp.imperative2.parser.Imp2Parser;
00037 import plp.orientadaObjetos1.memoria.ContextoCompilacao;
00038 import plp.orientadaObjetos1.memoria.ContextoExecucao;
00039 import plp.orientadaObjetos1.parser.OO1Parser;
00040
00041 public class InterpretadorPLP extends JFrame {
00042
00043 private JPanel jContentPane = null;
00044 private JTextArea jTextAreaCodigo = null;
00045 private JScrollPane jScrollPaneMensagens = null;
00046 private JTextArea jTextAreaMensagens = null;
00047 private JLabel jLabelCodigo = null;
00048 private JLabel jLabelMasg = null;
00049 private JScrollPane jScrollPaneCodigo = null;
00050 private JComboBox jComboBoxLinguagens = null;
00051 private JLabel jLabelExecutar = null;
00052
00053 private Exp1Parser exp1Parser = null;
00054 private Exp2Parser exp2Parser = null;
00055 private Func1Parser func1Parser = null;
00056 private Func2Parser func2Parser = null;
00057 private Imp1Parser imp1Parser = null;
00058 private Imp2Parser imp2Parser = null;
00059 private OO1Parser oo1Parser = null;
00060
00061 private InterpreterKeyListener listener;
00062 private JButton jButtonExecutar = null;
00063 private JTextField jTextFieldListaEntrada = null;
00064 private JLabel jLabelListaEntrada = null;
00065
00069 public InterpretadorPLP() {
00070 super();
00071 initialize();
00072 }
00073
00079 private void initialize() {
00080 this.setContentPane(getJContentPane());
00081 this.setTitle("Interpretador PLP V 0.3");
00082 this.setResizable(false);
00083 this.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
00084 this.listener = new InterpreterKeyListener(this);
00085 this.addKeyListener(this.listener);
00086 this.jTextAreaCodigo.addKeyListener(this.listener);
00087 this.jTextAreaMensagens.addKeyListener(this.listener);
00088 this.jTextFieldListaEntrada.addKeyListener(this.listener);
00089 this.jTextFieldListaEntrada.setEnabled(false);
00090
00091 Dimension d;
00092 int w, h;
00093
00094 w = 390;
00095 h = 480;
00096
00097 d = Toolkit.getDefaultToolkit().getScreenSize();
00098 d.height /= 2;
00099 d.width /= 2;
00100 d.height -= (h / 2 + 15);
00101 d.width -= (w / 2);
00102
00103 this.setBounds(d.width, d.height, w, h);
00104
00105 }
00106
00112 private JPanel getJContentPane() {
00113 if (jContentPane == null) {
00114 jLabelListaEntrada = new JLabel();
00115 jLabelListaEntrada.setBounds(new java.awt.Rectangle(20, 194, 127,
00116 20));
00117 jLabelListaEntrada
00118 .setToolTipText("informe os valores da lista de entrada separados por espaços");
00119 jLabelListaEntrada.setText("Lista de Entrada");
00120 jLabelExecutar = new JLabel();
00121 jLabelExecutar.setBounds(new java.awt.Rectangle(19, 434, 157, 17));
00122 jLabelExecutar.setText("Pressione F1 para executar");
00123 jLabelMasg = new JLabel();
00124 jLabelMasg.setBounds(new java.awt.Rectangle(20, 245, 80, 16));
00125 jLabelMasg.setText("Mensagens");
00126 jLabelCodigo = new JLabel();
00127 jLabelCodigo.setBounds(new java.awt.Rectangle(20, 33, 70, 16));
00128 jLabelCodigo.setText("Código");
00129 jContentPane = new JPanel();
00130 jContentPane.setLayout(null);
00131 jContentPane.add(getJScrollPaneMensagens(), null);
00132 jContentPane.add(jLabelCodigo, null);
00133 jContentPane.add(jLabelMasg, null);
00134 jContentPane.add(getJScrollPaneCodigo(), null);
00135 jContentPane.add(getJTextFieldListaEntrada(), null);
00136 jContentPane.add(getJComboBoxLinguagens(), null);
00137 jContentPane.add(jLabelExecutar, null);
00138 jContentPane.add(getJButton(), null);
00139 jContentPane.add(jLabelListaEntrada, null);
00140 }
00141 return jContentPane;
00142 }
00143
00149 private JTextArea getJTextAreaCodigo() {
00150 if (jTextAreaCodigo == null) {
00151 jTextAreaCodigo = new JTextArea();
00152 }
00153 return jTextAreaCodigo;
00154 }
00155
00161 private JScrollPane getJScrollPaneMensagens() {
00162 if (jScrollPaneMensagens == null) {
00163 jScrollPaneMensagens = new JScrollPane();
00164 jScrollPaneMensagens.setBounds(new java.awt.Rectangle(20, 267, 350,
00165 160));
00166 jScrollPaneMensagens.setViewportView(getJTextAreaMensagens());
00167 }
00168 return jScrollPaneMensagens;
00169 }
00170
00176 private JTextArea getJTextAreaMensagens() {
00177 if (jTextAreaMensagens == null) {
00178 jTextAreaMensagens = new JTextArea();
00179 }
00180 return jTextAreaMensagens;
00181 }
00182
00188 private JScrollPane getJScrollPaneCodigo() {
00189 if (jScrollPaneCodigo == null) {
00190 jScrollPaneCodigo = new JScrollPane();
00191 jScrollPaneCodigo
00192 .setBounds(new java.awt.Rectangle(20, 52, 350, 134));
00193 jScrollPaneCodigo.setViewportView(getJTextAreaCodigo());
00194 }
00195 return jScrollPaneCodigo;
00196 }
00197
00203 private JComboBox getJComboBoxLinguagens() {
00204 if (jComboBoxLinguagens == null) {
00205 jComboBoxLinguagens = new JComboBox();
00206 jComboBoxLinguagens
00207 .setBounds(new java.awt.Rectangle(19, 7, 250, 20));
00208 jComboBoxLinguagens
00209 .addActionListener(new java.awt.event.ActionListener() {
00210 public void actionPerformed(java.awt.event.ActionEvent e) {
00211 switch (jComboBoxLinguagens.getSelectedIndex()) {
00212 case 0:
00213 case 1:
00214 case 2:
00215 case 3:
00216 jTextFieldListaEntrada.setEnabled(false);
00217 break;
00218 default:
00219 jTextFieldListaEntrada.setEnabled(true);
00220 break;
00221 }
00222 }
00223 });
00224 jComboBoxLinguagens.addItem("Expressoes 1");
00225 jComboBoxLinguagens.addItem("Expressoes 2");
00226 jComboBoxLinguagens.addItem("Funcional 1");
00227 jComboBoxLinguagens.addItem("Funcional 2");
00228 jComboBoxLinguagens.addItem("Imperativa 1");
00229 jComboBoxLinguagens.addItem("Imperativa 2");
00230 jComboBoxLinguagens.addItem("Orientada a Objetos 1");
00231
00232 }
00233 return jComboBoxLinguagens;
00234 }
00235
00241 private JButton getJButton() {
00242 if (jButtonExecutar == null) {
00243 jButtonExecutar = new JButton();
00244 jButtonExecutar.setBounds(new java.awt.Rectangle(283, 8, 86, 19));
00245 jButtonExecutar.setText("executar");
00246 jButtonExecutar
00247 .addActionListener(new java.awt.event.ActionListener() {
00248 public void actionPerformed(java.awt.event.ActionEvent e) {
00249 interpretarCodigo();
00250 }
00251 });
00252 }
00253 return jButtonExecutar;
00254 }
00255
00261 private JTextField getJTextFieldListaEntrada() {
00262 if (jTextFieldListaEntrada == null) {
00263 jTextFieldListaEntrada = new JTextField();
00264 jTextFieldListaEntrada.setBounds(new java.awt.Rectangle(20, 218,
00265 350, 20));
00266 jTextFieldListaEntrada
00267 .setToolTipText("informe os valores da lista de entrada separados por espaços");
00268 }
00269 return jTextFieldListaEntrada;
00270 }
00271
00272 public static void main(String[] args) {
00273 (new InterpretadorPLP()).setVisible(true);
00274 }
00275
00276 public void interpretarCodigo() {
00277 try {
00278 ByteArrayInputStream fis = new ByteArrayInputStream(jTextAreaCodigo
00279 .getText().getBytes());
00280
00281 switch (this.jComboBoxLinguagens.getSelectedIndex()) {
00282 case 0:
00283 interpretarExp1(fis);
00284 break;
00285 case 1:
00286 interpretarExp2(fis);
00287 break;
00288 case 2:
00289 interpretarFunc1(fis);
00290 break;
00291 case 3:
00292 interpretarFunc2(fis);
00293 break;
00294 case 4:
00295 interpretarImp1(fis);
00296 break;
00297 case 5:
00298 interpretarImp2(fis);
00299 break;
00300 case 6:
00301 interpretarOO1(fis);
00302 break;
00303 }
00304 } catch (Exception e1) {
00305 jTextAreaMensagens.setText(e1.getMessage());
00306 e1.printStackTrace();
00307 } catch (Throwable t) {
00308 jTextAreaMensagens.setText(t.getMessage());
00309 }
00310
00311 }
00312
00313 private void interpretarExp1(InputStream fis) throws ParseException {
00314 plp.expressions1.Programa prog;
00315 if (exp1Parser == null) {
00316 exp1Parser = new Exp1Parser(fis);
00317 } else {
00318 Exp1Parser.ReInit(fis);
00319 }
00320 prog = Exp1Parser.Input();
00321 jTextAreaMensagens.setText("sintaxe verificada com sucesso!\n");
00322 if (prog.checaTipo()) {
00323 jTextAreaMensagens.append("resultado = "
00324 + prog.executar().toString());
00325 } else {
00326 jTextAreaMensagens.append("erro de tipos!");
00327 }
00328 }
00329
00330 private void interpretarExp2(InputStream fis) throws Exception {
00331 plp.expressions2.Programa prog;
00332 if (exp2Parser == null) {
00333 exp2Parser = new Exp2Parser(fis);
00334 } else {
00335 Exp2Parser.ReInit(fis);
00336 }
00337 prog = Exp2Parser.Input();
00338
00339 jTextAreaMensagens.setText("sintaxe verificada com sucesso!\n");
00340 if (prog.checaTipo()) {
00341 jTextAreaMensagens.append("resultado = "
00342 + prog.executar().toString());
00343 } else {
00344 jTextAreaMensagens.append("erro de tipos!");
00345 }
00346 }
00347
00348 private void interpretarFunc1(InputStream fis) throws Exception {
00349 plp.functional1.Programa prog;
00350 if (func1Parser == null) {
00351 func1Parser = new Func1Parser(fis);
00352 } else {
00353 Func1Parser.ReInit(fis);
00354 }
00355 prog = Func1Parser.Input();
00356
00357 jTextAreaMensagens.setText("sintaxe verificada com sucesso!\n");
00358 if (prog.checaTipo()) {
00359 jTextAreaMensagens.append("resultado = "
00360 + prog.executar().toString());
00361 } else {
00362 jTextAreaMensagens.append("erro de tipos!");
00363 }
00364 }
00365
00366 private void interpretarFunc2(InputStream fis) throws Exception {
00367 plp.functional2.Programa prog;
00368 if (func2Parser == null) {
00369 func2Parser = new Func2Parser(fis);
00370 } else {
00371 Func2Parser.ReInit(fis);
00372 }
00373
00374 prog = Func2Parser.Input();
00375
00376 jTextAreaMensagens.setText("sintaxe verificada com sucesso!\n");
00377 jTextAreaMensagens.append("resultado = " + prog.executar().toString());
00378 }
00379
00380 private void interpretarImp1(InputStream fis) throws Exception {
00381 plp.imperative1.Programa prog;
00382 if (imp1Parser == null) {
00383 imp1Parser = new Imp1Parser(fis);
00384 } else {
00385 Imp1Parser.ReInit(fis);
00386 }
00387 prog = Imp1Parser.Input();
00388
00389 jTextAreaMensagens.setText("sintaxe verificada com sucesso!\n");
00390 ListaValor entrada = obterListaEntrada(this.jTextFieldListaEntrada
00391 .getText());
00392 if (prog.checaTipo(new ContextoCompilacaoImperativa(entrada))) {
00393 jTextAreaMensagens.append("resultado = "
00394 + prog.executar(new ContextoExecucaoImperativa(entrada))
00395 .toString());
00396 } else {
00397 jTextAreaMensagens.append("erro de tipos!");
00398 }
00399 }
00400
00401 private void interpretarImp2(InputStream fis) throws Exception {
00402 plp.imperative2.Programa prog;
00403 if (imp2Parser == null) {
00404 imp2Parser = new Imp2Parser(fis);
00405 } else {
00406 Imp2Parser.ReInit(fis);
00407 }
00408
00409 prog = Imp2Parser.Input();
00410
00411 jTextAreaMensagens.setText("sintaxe verificada com sucesso!\n");
00412 ListaValor entrada = obterListaEntrada(this.jTextFieldListaEntrada
00413 .getText());
00414 if (prog.checaTipo(new ContextoCompilacaoImperativa2(entrada))) {
00415 jTextAreaMensagens.append("resultado = "
00416 + prog.executar(new ContextoExecucaoImperativa2(entrada))
00417 .toString());
00418 } else {
00419 jTextAreaMensagens.append("erro de tipos!");
00420 }
00421 }
00422
00423 private void interpretarOO1(InputStream fis) throws Exception {
00424 plp.orientadaObjetos1.Programa prog;
00425 if (oo1Parser == null) {
00426 this.oo1Parser = new OO1Parser(fis);
00427 } else {
00428 oo1Parser.ReInit(fis);
00429 }
00430 prog = oo1Parser.processaEntrada();
00431
00432 jTextAreaMensagens.setText("sintaxe verificada com sucesso!\n");
00433 plp.orientadaObjetos1.memoria.colecao.ListaValor entrada = obterListaEntrada2(this.jTextFieldListaEntrada
00434 .getText());
00435 if (prog
00436 .checaTipo(new plp.orientadaObjetos1.memoria.ContextoCompilacao(entrada))) {
00437 jTextAreaMensagens.append("resultado = "
00438 + prog.executar(new plp.orientadaObjetos1.memoria.ContextoExecucao(entrada)).toString());
00439 } else {
00440 jTextAreaMensagens.append("erro de tipos!");
00441 }
00442 }
00443
00444 private plp.orientadaObjetos1.memoria.colecao.ListaValor obterListaEntrada2(String texto) {
00445 List valores = new LinkedList();
00446 plp.orientadaObjetos1.memoria.colecao.ListaValor entrada = new plp.orientadaObjetos1.memoria.colecao.ListaValor();
00447 StringTokenizer parser = new StringTokenizer(texto);
00448
00449 while (parser.hasMoreTokens()) {
00450 String parametro = parser.nextToken();
00451
00452 try {
00453 Integer inteiro = Integer.valueOf(parametro);
00454 valores.add(new plp.orientadaObjetos1.expressao.valor.ValorInteiro(inteiro.intValue()));
00455 continue;
00456 } catch (NumberFormatException e) {
00457
00458 }
00459
00460 if (parametro.equalsIgnoreCase("true")
00461 || parametro.equalsIgnoreCase("false")) {
00462 Boolean booleano = Boolean.valueOf(parametro);
00463 valores.add(new plp.orientadaObjetos1.expressao.valor.ValorBooleano(booleano.booleanValue()));
00464 } else {
00465 valores.add(new plp.orientadaObjetos1.expressao.valor.ValorString(parametro));
00466 }
00467 }
00468 entrada = OO1Parser.criaListaValor(valores);
00469 return entrada;
00470 }
00471
00472 private ListaValor obterListaEntrada(String texto) {
00473 List valores = new LinkedList();
00474 ListaValor entrada = new ListaValor();
00475 StringTokenizer parser = new StringTokenizer(texto);
00476
00477 while (parser.hasMoreTokens()) {
00478 String parametro = parser.nextToken();
00479
00480 try {
00481 Integer inteiro = Integer.valueOf(parametro);
00482 valores.add(new ValorInteiro(inteiro.intValue()));
00483 continue;
00484 } catch (NumberFormatException e) {
00485
00486 }
00487
00488 if (parametro.equalsIgnoreCase("true")
00489 || parametro.equalsIgnoreCase("false")) {
00490 Boolean booleano = Boolean.valueOf(parametro);
00491 valores.add(new ValorBooleano(booleano.booleanValue()));
00492 } else {
00493 valores.add(new ValorString(parametro));
00494 }
00495 }
00496 entrada = Imp1Parser.criaListaValor(valores);
00497 return entrada;
00498 }
00499 }
00500
00501 class InterpreterKeyListener implements KeyListener {
00502
00503 InterpretadorPLP frame;
00504
00505 public InterpreterKeyListener(InterpretadorPLP frm) {
00506 super();
00507 this.frame = frm;
00508 }
00509
00510 public void keyPressed(java.awt.event.KeyEvent e) {
00511 if (e.getKeyCode() == KeyEvent.VK_F1) {
00512 this.frame.interpretarCodigo();
00513 }
00514 }
00515
00516 public void keyReleased(KeyEvent arg0) {
00517 }
00518
00519 public void keyTyped(KeyEvent arg0) {
00520 }
00521 }