📄 ries.java
字号:
import java.awt.*;import java.awt.event.*;import java.io.*;import java.util.*;import javax.swing.*;import javax.swing.filechooser.FileFilter;import javax.swing.event.*;import java.awt.datatransfer.*;import java.math.*;public class Ries{ //String alphabet; /** * Erzeugt decimale Darstellung einer binaer dargestellten Zahl * @param String - die zu konvertierende Zahl in Form eines Strings * @return String - Ergebnis in Form von String */ public static String bi_to_n(String s) throws NumberFormatException { int x=0; //int k=2; BigInteger k=new BigInteger("2"); BigInteger ergebnis=new BigInteger("0"); for(int i=s.length()-1;i>=0;i--) { char ch=s.charAt(i); //if((ch=='0') && (ch=='1')) //{ //int a=Integer.parseInt(new Character(ch).toString()); BigInteger a=new BigInteger(new Character(ch).toString()); if((a.toString().equals("0")) || (a.toString().equals("1"))) { // throw new NumberFormatException(); //} //System.out.println(new BigInt(new Integer((int)(a*Math.pow(k,x))).toString()).toString()); BigInteger big=(k.pow(x)).multiply(a); ergebnis=ergebnis.add(big); //ergebnis.add(new BigInt(new Double(a*Math.pow(k,x)).toString())); //System.out.println(a.toString()+" "+x+" "+" "+big+" "+ergebnis.toString()); x++; } else {throw new NumberFormatException();} } //System.out.println(ergebnis); //return (new Integer(ergebnis).toString()); return ergebnis.toString(); } public static String k_to_n(int zahl,String s,String alphabet) throws NumberFormatException { int x=0; //int k=2; BigInteger k=new BigInteger(new Integer(zahl).toString()); BigInteger ergebnis=new BigInteger("0"); BigInteger a; for(int i=s.length()-1;i>=0;i--) { char ch=s.charAt(i); if(alphabet.indexOf(new Character(ch).toString())!=-1) { //int a=Integer.parseInt(new Character(ch).toString()); try { a=new BigInteger(new Character(ch).toString()); } catch(NumberFormatException e) { int u=alphabet.indexOf(ch); a=new BigInteger(new Integer(u).toString()); } BigInteger big=(k.pow(x)).multiply(a); ergebnis=ergebnis.add(big); //System.out.println(a.toString()+" "+x+" "+" "+big+" "+ergebnis.toString()); x++; } else throw new NumberFormatException(); } return ergebnis.toString(); } /* public static String n_to_k(BigInt k,String s,String alphabet) { BigInt a=new BigInt(s); String k_ergebnis=""; String end_ergebnis=""; String end_ergebnis1=""; while(a.ne(new BigInt("0"))) { k_ergebnis+=(a.mod(k)).toString(); a=a.divide(k); } for(int i=k_ergebnis.length()-1;i>=0;i--) { end_ergebnis+=k_ergebnis.charAt(i); } for(int i=0;i<end_ergebnis.length();i++) { int index=Integer.parseInt(new Character(end_ergebnis.charAt(i)).toString()); end_ergebnis1+=new Character(alphabet.charAt(index)).toString(); } return end_ergebnis1; }*/ public static String alphabet_einlesen(String alph) { String ergebnis=""; StringTokenizer strTok=new StringTokenizer(alph,","); while(strTok.hasMoreTokens()) { ergebnis+=strTok.nextToken(); } return ergebnis; } public static void main(String[] args) { String alphabet=""; final int DECIMAL=0; final int BINARY=1; final int K_ADISCH=2; int eingabeArt=DECIMAL; // added by Michael if (args.length >= 2) { if (args[0].equals("-c")) { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); // Scanner und Parser werden erzeugt Scanner scanner = new Scanner(args[1]); Parser parser = new Parser(scanner); if(parser.parseProgramm()) { // Es wird ein Objekt der Klasse PrintWriter erzeugt , das dafuer sorgt , dass // in Java uebersetztes Ries-Programm in der Datei JavaCode.java gespeichert wird. // Falls JavaCode.java nicht existiert , wird sie erzeugt try { PrintWriter out=new PrintWriter(new FileOutputStream("JavaCode.java")); //Die Ausgabe wird in JavaCode.java gespeichert out.print(parser.getJavaCode()); out.close(); System.out.println("Uebersetzung in Javacode geglueckt..."); } catch (FileNotFoundException e) { System.out.println("Beim Erstellen der Ausgabedatei 'JavaCode.java' ist ein Fehler aufgetreten"); } // Zur Erzeugung neuer Prozesse steht die Methode exec der Klasse Runtime zur Verfuegung. // Der Systembefehl wird in einem einfachen String-Objekt uebergeben. // Um die Ausgabe eines Prozesses zu lesen muss Java mit dem Prozess (Process-Objekt) // kommunizieren. //Die Prozessdaten werden auf System.out angezeigt PrintWriter out1=new PrintWriter(System.out,true); //Systembefehl String cmd="javac JavaCode.java"; try { //Ausfuehrung des Systemsbefehls Process proc=Runtime.getRuntime().exec(cmd); //Ausgabe der durch javac entdeckten Fehler BufferedReader in1=new BufferedReader(new InputStreamReader(proc.getErrorStream())); for(;;) { String inp=in1.readLine(); if(inp==null) break; out1.println(inp); } System.out.println("Uebersetzung des Javacodes in ausfuehrbaren Code geglueckt...\nFertig."); } catch(IOException e) { System.out.println("Fehler"); } try{ System.out.println("Programm laeuft..."); BufferedReader in_eingabe; FileWriter fw; if(args.length>=3) in_eingabe=new BufferedReader(new FileReader(args[2]));//Datei in der Eingabedaten gespeichert werden else in_eingabe=new BufferedReader(new FileReader("Eingabe.txt"));//Datei in der Eingabedaten gespeichert werden if(args.length==4) fw=new FileWriter(args[3]); //Datei in der Ausgabedaten gespeichert werden else fw=new FileWriter("Ausgabe.txt"); //Datei in der Ausgabedaten gespeichert werden String kommandoZeilenParameter=""; String zwischenString=""; String s=""; //Man liest aus Eingabedatei und speichert den Inhalt in der Variable zwischenString while((s=in_eingabe.readLine())!=null) { zwischenString+=s; } StringTokenizer t=new StringTokenizer(zwischenString);//Die Eingabedaten werden in Tokens geteilt try //Falls Eingabedatei leer ist wird NoSuchElementException geworfen { String str=t.nextToken(); //Erster Token gibt die Art der Eingabe an(binaer,decimal,k-adisch) System.out.println(str); if(str.equals("d")) { eingabeArt=DECIMAL; } else if(str.equals("b")) { eingabeArt=BINARY; } else if(str.equals("k")) { eingabeArt=K_ADISCH; } else eingabeArt=DECIMAL; if(eingabeArt==K_ADISCH) { String strng=t.nextToken(); alphabet=alphabet_einlesen(strng); } while(t.hasMoreTokens()) //Parameter werden eingelesen { String strng=t.nextToken(); if(eingabeArt==DECIMAL || eingabeArt==BINARY) { try //Es wird uberprueft,ob es um Zahlen handelt.Falls nicht wird Exception geworfen { BigInt b=new BigInt(strng); } catch(Exception e){ fw.write("Es werden Zahlen als Parameter erwartet"); } if(eingabeArt==BINARY) //Falls es um Zahlen in binaerer Darstellungsform vorliegen,werden sie in Dezimalzahlen umgewandelt { try { String p=bi_to_n(strng)+" "; kommandoZeilenParameter+=p; } catch(NumberFormatException e){ fw.write("Bin鋜e Zahlen erwartet\n");} } else kommandoZeilenParameter+=" "+strng; } else if(eingabeArt==K_ADISCH) { try { String p=k_to_n(alphabet.length(),strng,alphabet)+ " "; kommandoZeilenParameter+=p; } catch(NumberFormatException e){ fw.write("Keine g黮tige Zahl\n");} } else kommandoZeilenParameter+=" "+strng; } Process proc=Runtime.getRuntime().exec("java JavaCode "+kommandoZeilenParameter); //Ausf黨rung des Systemsbefehls BufferedReader in1=new BufferedReader(new InputStreamReader(proc.getErrorStream())); //Ausgabe der durch java entdeckten Fehler BufferedReader in2=new BufferedReader(new InputStreamReader(proc.getInputStream())); //Ausgabe der durch java berechneten Daten String inp=in1.readLine(); String ausgabe; while((ausgabe=in2.readLine())!=null) { //if(inp==null)//Falls keine Fehler beim Ausfuerung vorliegen //{ if((ausgabe.indexOf("Ergebnis"))==-1)//Falls kein Ergebnis errechnet wurde,wird eine Erklaerung dafuer ausgegeben { fw.write(ausgabe+"\n"); } else { fw.write(ausgabe); if(eingabeArt==BINARY)//Falls die Eingabe binaer war,wird Ergebnis sowohl binaer als auch dezimal ausgegeben { BigInt n=new BigInt(ausgabe.substring(10)); fw.write("\nBin鋜e Ausgabe: "+n.toString(2)); } else if(eingabeArt==K_ADISCH) { //BigInt k=new BigInt(new Integer(alphabet.length()).toString()); //BigInt n=new BigInt(ausgabe.substring(10)); //fw.write("\nK_Adische Ausgabe: "+n_to_k(k,n.toString(),alphabet)); } } //} //else //{ //fw.write(inp);//Fehlerausgabe //} //fw.close();//s.u. } System.out.println("Ausfuerung abgeschlossen"); fw.close(); } catch(NoSuchElementException e){ System.out.println("Ausfuerung abgeschlossen");fw.write("Datei ist leer");fw.close(); } } catch(IOException e){System.out.println(e.toString());} } else { Vector errors=parser.getErrors(); for(int i=0;i<errors.size();i++) { ParserException e=(ParserException)errors.get(i); System.out.println(e.getMessage()); } } } else { System.out.println("So wird Ries richtig gestartet:\n\n" + "\tjava Ries [-h|-c] [Dateiname]\n" + "\n" + "-h\tlaesst die Hilfe zum Programmaufruf erscheinen\n" + "-c\tstartet das Compilieren ohne graphische Benutzeroberflaeche, falls\n" + "\tzusaetzlich ein Dateiname angegeben wurde"); } } else if (args.length == 1) { if (args[0].equals("-h")) { System.out.println("So wird Ries gestartet:\n\n" + "\tjava Ries [-h|-c] [Dateiname]\n" + "\n" + "-h\tlaesst die Hilfe zum Programmaufruf erscheinen\n" + "-c\tstartet das Compilieren ohne graphische Benutzeroberflaeche, falls\n" + "\tzusaetzlich ein Dateiname angegeben wurde"); } else if (args[0].equals("-c")) { System.out.println("Die Compilierung ohne graphische Benutzeroberflaeche ist ohne Angabe\n" + "einer Quellcodedatei nicht moeglich."); } else { RiesFrame frame=new RiesFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.show(); frame.loadFile(args[0]); } } else if (args.length == 0) { RiesFrame frame=new RiesFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.show(); } else { System.out.println("So wird richtig Ries gestartet:\n\n" + "\tjava Ries [-h|-c] [Dateiname]\n" + "\n" + "-h\tlaesst die Hilfe zum Programmaufruf erscheinen\n" + "-c\tstartet das Compilieren ohne graphische Benutzeroberflaeche, falls\n" + "\tzusaetzlich ein Dateiname angegeben wurde"); } } // Ende Michael}class RiesFrame extends JFrame{ /** * Erzeugt ein Objekt der Klasse RiesFrame, das zwei Textbereiche(zu Texteingabe,zu Fehlerausgabe), * drei Men黶(Datei,Bearbeiten,Tools) und eine Symbolleiste beinhaltet */ public RiesFrame() { setTitle("Ries"); setSize(WIDTH,HEIGHT); sysClipboard=Toolkit.getDefaultToolkit().getSystemClipboard(); //Zwischenablage wird initialisiert //Men
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -