Einfacher parser funktioniert nicht

EinNickname9

Bekanntes Mitglied
Ich möcht einen einfachen Parser um eine Phantasiesprache in eine Java ähnliche Sprache zu konvertieren schreiben. Aber leider funktioniert irgendetwas nicht.

Beispiel Eingabe:
Code:
global int temp1
global int temp2
allocation temp2 0

var int i
allocation i 5
var int j
allocation j 10
while i > 0
  while j > 0
    op temp2 + 1
    op j - 1
  end
  allocation j 10
  op i - 1
end
allocation i 5
var int k
allocation k 42
op temp2 + k
allocation temp1 temp2

Die Ausgabe ist allerdings:
Code:
  public static int temp1
global;

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Parser implements ActionListener {
    private final JTextArea area1 = new JTextArea();
    private final JTextArea area2 = new JTextArea();
    private final JButton button1 = new JButton("Convert");

    public Parser() {
        JFrame frame = new JFrame("Code...");
        JPanel p1 = new JPanel(new BorderLayout());
        JPanel p2 = new JPanel(new BorderLayout());
        JPanel p3 = new JPanel(new GridLayout(1, 1));
        area1.setFont(Font.decode(Font.MONOSPACED));
        area2.setFont(Font.decode(Font.MONOSPACED));
        button1.addActionListener(this);

        p3.add(button1);
        p2.add(p3, BorderLayout.SOUTH);
        p1.add(new JScrollPane(area2), BorderLayout.CENTER);
        p1.add(p2, BorderLayout.WEST);
        frame.setLayout(new GridLayout(1, 2));
        frame.add(new JScrollPane(area1));
        frame.add(p1);
        frame.setSize(800, 800);
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new Parser();
    }

    private static class LogicEntry {
        public static int static_id = 0;

        int id, lineNumber;
        String type, one, two, three;
        boolean atomar, opens, closes;
        LogicEntry pair;

        public LogicEntry(int lineNumber, String type, String one, String two, String three, boolean atomar, boolean opens, boolean closes, LogicEntry pair) {
            this.id = static_id;
            static_id++;
            this.lineNumber = lineNumber;
            this.type = type;
            this.one = one;
            this.two = two;
            this.three = three;
            this.atomar = atomar;
            this.opens = opens;
            this.closes = closes;
            this.pair = pair;
        }
    }

    private void parse(String code) {
        List<LogicEntry> entries = new ArrayList<>();
        String[] lines = code.split(System.getProperty("line.separator"));
        for (int i = 0; i < lines.length; i++) {
            String l = lines[i].trim();
            if (l.startsWith("global")) {
                String[] split = l.split(" ");
                entries.add(new LogicEntry(i, "global", split[1], split[2], null, true, true, false, null));
            }
            if (l.startsWith("var")) {
                String[] split = l.split(" ");
                entries.add(new LogicEntry(i, "var", split[1], split[2], null, true, true, false, null));
            }
            if (l.startsWith("while")) {
                String[] split = l.split(" ");
                entries.add(new LogicEntry(i, "while", split[1], split[2], split[3], false, true, false, null));
            }
            if (l.startsWith("end")) {
                for (int j = entries.size() - 1; j >= 0; j--) {
                    LogicEntry le = entries.get(j);
                    if (!le.atomar && le.opens) {
                        entries.add(new LogicEntry(i, le.type, null, null, null, false, false, true, le));
                        le.pair = entries.get(entries.size() - 1);
                        break;
                    }
                }
            }
            if (l.startsWith("allocation")) {
                String[] split = l.split(" ");
                entries.add(new LogicEntry(i, "allocation", split[1], split[2], null, true, true, false, null));
            }
            if (l.startsWith("op")) {
                String[] split = l.split(" ");
                entries.add(new LogicEntry(i, "op", split[1], split[2], split[3], true, true, false, null));
            }
        }
        int indention = 1;
        for (int i = 0; i < entries.size(); i++) {
            LogicEntry le = entries.get(i);
            if (le.type.equals("global")) {
                char[] whitespaces = new char[indention * 2];
                Arrays.fill(whitespaces, ' ');
                area2.append(String.valueOf(whitespaces) + "public static " + le.one + " " + le.two + ";\n");
            }
        }
        for (int i = 0; i < entries.size(); i++) {
            LogicEntry le = entries.get(i);
            if (le.type.equals("var")) {
                char[] whitespaces = new char[indention * 2];
                Arrays.fill(whitespaces, ' ');
                area2.append(String.valueOf(whitespaces) + le.one + " " + le.two + ";\n");
            }
            if (le.type.equals("allocation")) {
                char[] whitespaces = new char[indention * 2];
                Arrays.fill(whitespaces, ' ');
                area2.append(String.valueOf(whitespaces) + le.one + " = " + le.two + ";\n");
            }
            if (le.type.equals("op")) {
                char[] whitespaces = new char[indention * 2];
                Arrays.fill(whitespaces, ' ');
                area2.append(String.valueOf(whitespaces) + le.one + " = " + le.one + " " + le.two + " " + le.three + ";\n");
            }
            if (le.type.equals("while")) {
                // ???
                if (le.opens) {
                    char[] whitespaces = new char[indention * 2];
                    Arrays.fill(whitespaces, ' ');
                    area2.append(String.valueOf(whitespaces) + "while (" + le.one + " " + le.two + " " + le.three + ") {\n");
                    indention++;
                }
                if (le.closes) {
                    indention--;
                    char[] whitespaces = new char[indention * 2];
                    Arrays.fill(whitespaces, ' ');
                    area2.append(String.valueOf(whitespaces) + "}\n");
                }
                // ???
            }
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == button1) {
            area2.setText("");
            String code = area1.getText();
            parse(code);
            area2.setCaretPosition(area2.getText().length());
            area2.repaint();
        }
    }
}

und wie könnte ich if-else hinzufügen?
 

Robert Zenz

Top Contributor
Funktioniert fuer mich, bekomme folgende Ausgabe:

Code:
  public static int temp1;
  public static int temp2;
  temp2 = 0;
  int i;
  i = 5;
  int j;
  j = 10;
  while (i > 0) {
    while (j > 0) {
      temp2 = temp2 + 1;
      j = j - 1;
    }
    j = 10;
    i = i - 1;
  }
  i = 5;
  int k;
  k = 42;
  temp2 = temp2 + k;
  temp1 = temp2;

Java:
String[] lines = code.split(System.getProperty("line.separator"));

Eventuell solltest du hier nach beliebigen Zeilenumbruechen abteilen, da du nicht kontrollieren kannst welche wirklich im Textfeld landen:

Java:
String[] lines = code.split("(\\n|\\r)+");
 

mrBrown

Super-Moderator
Mitarbeiter
Ähnliche Java Themen
  Titel Forum Antworten Datum
N JavaFX Einfacher Taschenrechner mit Scene Builder und Java FX AWT, Swing, JavaFX & SWT 0
A Swing Vokabeltrainer zeigt in einfacher Ausführung nichts an AWT, Swing, JavaFX & SWT 5
J Progressbar mit einfacher Funktion AWT, Swing, JavaFX & SWT 6
2 Einfacher Baum visualisieren. AWT, Swing, JavaFX & SWT 11
R einfacher mp3 player AWT, Swing, JavaFX & SWT 18
N einfacher ActionListener und NullPointer AWT, Swing, JavaFX & SWT 2
V ButtonGroup einfacher überwachen? AWT, Swing, JavaFX & SWT 7
H einfacher TextEditor AWT, Swing, JavaFX & SWT 4
S Einfacher Klick aber mouseClicked() zweimal aufgerufen AWT, Swing, JavaFX & SWT 3
C einfacher Texteditor in Java AWT, Swing, JavaFX & SWT 3
J Eigenen Parser schreiben AWT, Swing, JavaFX & SWT 8
S Wie kann man eine XSLT-Parser schreiben? AWT, Swing, JavaFX & SWT 2
B Http Parser funktioniert nicht mit JRE 1.5.0, warum! AWT, Swing, JavaFX & SWT 4
R [JTable] Parser nach Zelleneingabe AWT, Swing, JavaFX & SWT 12
Juelin if Abfrage funktioniert nicht richtig AWT, Swing, JavaFX & SWT 10
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
P AWT Programm funktioniert nicht richtig AWT, Swing, JavaFX & SWT 35
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
M Scrollbar funktioniert nicht AWT, Swing, JavaFX & SWT 10
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
W JEditorPane textausrichtung nach settext funktioniert nicht mehr AWT, Swing, JavaFX & SWT 11
H Swing Anpassen der Textgröße im JLabel funktioniert nur bedingt AWT, Swing, JavaFX & SWT 7
sserio JFrame setIconImmage() funktioniert nicht AWT, Swing, JavaFX & SWT 3
T Swing Tooltip-Delay funktioniert nicht immer. AWT, Swing, JavaFX & SWT 1
B Output GUI funktioniert nur beim ersten Mal richtig. AWT, Swing, JavaFX & SWT 4
sserio Wie funktioniert ein Controller bei JavaFx? AWT, Swing, JavaFX & SWT 1
U Wie funktioniert das rotieren unter 2dGraphics, also wie stelle ich z. B. 90° ein? AWT, Swing, JavaFX & SWT 1
U Wie funktioniert Polygon? AWT, Swing, JavaFX & SWT 1
U Wie genau funktioniert 2dgraphics, in diesem Bezug? AWT, Swing, JavaFX & SWT 4
S ChoiceBox aus ArrayList per setValue() mit Wert belegen funktioniert nicht. AWT, Swing, JavaFX & SWT 0
H KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
H BufferedImage zurücksetzen funktioniert nicht AWT, Swing, JavaFX & SWT 12
H RPG Programmieren, label.setLocation funktioniert nicht AWT, Swing, JavaFX & SWT 7
F Swing Adapt Row Height funktioniert nicht richtig :( AWT, Swing, JavaFX & SWT 7
P Swing jxmapviewer hinzufügen/nutzen funktioniert nicht AWT, Swing, JavaFX & SWT 7
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
J Anbindung Textfeldklasse an Table funktioniert nicht AWT, Swing, JavaFX & SWT 3
R Actionlistener funktioniert nicht AWT, Swing, JavaFX & SWT 4
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
H Bewegung funktioniert nicht AWT, Swing, JavaFX & SWT 3
N Pixelfarbe abgleichen funktioniert nicht AWT, Swing, JavaFX & SWT 5
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
N eclipse Java, bilder benutzten Funktioniert nicht AWT, Swing, JavaFX & SWT 6
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
steven789hjk543 Swing Weiß jemand, warum dieses Programm nicht funktioniert? AWT, Swing, JavaFX & SWT 7
M Swing setMaximumSize funktioniert nicht AWT, Swing, JavaFX & SWT 1
K JavaFX funktioniert nicht AWT, Swing, JavaFX & SWT 2
B AWT actionPerformed Method funktioniert nicht AWT, Swing, JavaFX & SWT 12
L JavaFX Drag and Drop funktioniert nicht AWT, Swing, JavaFX & SWT 3
M Swing Code funktioniert auf Windows aber nicht Linux... AWT, Swing, JavaFX & SWT 3
T LookAndFeel LookAndFeel funktioniert nicht beim JFrame wechsel AWT, Swing, JavaFX & SWT 3
J JavaFX addListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
P CardLayout funktioniert fehlerhaft AWT, Swing, JavaFX & SWT 13
L WrapLayout funktioniert nicht AWT, Swing, JavaFX & SWT 1
kodela Accalerator für einige Menüoptionen funktioniert nicht mehr AWT, Swing, JavaFX & SWT 3
S JavaFX mit javac compilieren funktioniert nicht AWT, Swing, JavaFX & SWT 2
K Swing Entfernen von Panel funktioniert nicht AWT, Swing, JavaFX & SWT 5
J AWT System Farben / java.awt.SystemColor funktioniert nicht AWT, Swing, JavaFX & SWT 4
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
K javafx app > "run in browser" funktioniert nicht AWT, Swing, JavaFX & SWT 3
N JavaFX GridPane Halignment funktioniert nicht AWT, Swing, JavaFX & SWT 1
it_is_all JLabel.setIcon - funktioniert nicht mehr AWT, Swing, JavaFX & SWT 2
R Ausgabe über JOptionPane.showMessageDialog funktioniert nicht AWT, Swing, JavaFX & SWT 2
L 2D-Grafik Frage zu Ellipse2D.Double, Abfrage, ob Punkt enthalten ist funktioniert nicht AWT, Swing, JavaFX & SWT 3
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
F "ActionListener" funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z BoxLayout funktioniert nicht und Buttongröße AWT, Swing, JavaFX & SWT 18
C Java Hintergrund funktioniert nicht AWT, Swing, JavaFX & SWT 9
J Swing Wie funktioniert dieser ChangePropertyListener??? AWT, Swing, JavaFX & SWT 0
GreenTeaYT Button funktioniert nicht für Ein-und Auszahlungen? AWT, Swing, JavaFX & SWT 8
C Keylistener funktioniert nicht AWT, Swing, JavaFX & SWT 1
A Swing Programm funktioniert aber zwei Buttons werden angezeigt AWT, Swing, JavaFX & SWT 3
M UIManager funktioniert nicht mit Farben AWT, Swing, JavaFX & SWT 9
M Swing UIManager funktioniert nicht mit Farben AWT, Swing, JavaFX & SWT 0
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
S JavaFX wie funktioniert CSS und javaFX AWT, Swing, JavaFX & SWT 19
S KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 2
J JScrollPane funktioniert nicht AWT, Swing, JavaFX & SWT 5
M JavaFX Eventhandler Funktioniert nicht AWT, Swing, JavaFX & SWT 3
Sogomn JavaFX Injektion funktioniert nicht AWT, Swing, JavaFX & SWT 4
Blender3D Swing KeyBoardListener funktioniert nicht unter UBUNTU AWT, Swing, JavaFX & SWT 7
J JavaFX Button funktioniert(nicht) AWT, Swing, JavaFX & SWT 3
J DefaultCloseOperation funktioniert nicht AWT, Swing, JavaFX & SWT 9
F JavaFX ObservableList -- warum funktioniert das so.... AWT, Swing, JavaFX & SWT 3
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
Paul15 Button funktioniert nur einmal AWT, Swing, JavaFX & SWT 9
D Swing Warum erhalte ich keine Ausgabe? Funktioniert der equals-vergleich in actionPeformed nicht richtig? AWT, Swing, JavaFX & SWT 3
H UpdatePolicy wird nicht richtig gesetzt / funktioniert nicht AWT, Swing, JavaFX & SWT 5
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
N KeyListener funktioniert nicht richitg AWT, Swing, JavaFX & SWT 4
L Event Handling wie funktioniert .getComponent? AWT, Swing, JavaFX & SWT 1
B JavaFX Scene Builder: resize funktioniert (meist) nicht AWT, Swing, JavaFX & SWT 6
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
D Passwort [Aber mit 3 Versuchen] Funktioniert nicht wie erwartet AWT, Swing, JavaFX & SWT 4
C Applet Applet funktioniert in Eclipse aber nicht in Browser AWT, Swing, JavaFX & SWT 1
J Zellen in JavaFx einfärben funktioniert nicht AWT, Swing, JavaFX & SWT 1
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben