Compiler mit .bat bauen

Alrik Wegner

Newbie
Registriert
März 2019
Beiträge
2
Hallo, ich bin neu hier!
Ich bekomme es einfach nicht hin, eine Batch zu schreiben, die die Folgende Aufgabe erfüllt.
Ich habe schon diverse Foren & Seiten durchsucht und immer nur Teillösungen gefunden, die aber weitere Probleme gebracht haben, sodass es nie ganz funktioniert hat.
Folgende Befehle stehen in Dateien, die übersetzt werden sollen.
Code:
load.var 001b
load.flag 000b
store.var 0035
store.flag 00a4
goto 00b9
goto.when 00b5
write.acc b38f
send.var 9345
send.flag 069a
condition 0003
addup
subtract
multiply
divide
run
shutdown
#Kommentar

Übersetzt werden soll das ganze dann nach diesem Schema:
Code:
load.var val      >> 0001+[val]
load.flag val     >> 0002+[val]
store.var val     >> 0003+[val]
store.flag val    >> 0004+[val]
goto val          >> 0005+[val]
goto.when val     >> 0006+[val]
write.acc val     >> 0007+[val]
send.val val      >> 0008+[val]
send.flag         >> 0009+0000
condition val     >> 000a+[val]
addup             >> 000b+0000
subtract          >> 000c+0000
multiply          >> 000d+0000
divide            >> 000e+0000
run               >> 000f+0000
shutdown          >> 0010+0000
[val]
steht für den Wert, der hinter dem Befehl steht und das "+" dient hier nur als Platzhalter. Letztendlich soll dann aus dem Quellcode dann etwas in diese Richtung in einer Textdatei gespeichert werden: 000304f7 00100003 000309ff 000700f9 000c0057 00060a07 00...
Die jeweils 8-stelligen Hexadezimal-Werte können durch Leerzeichen oder auch durch Absätze getrennt sein.

Bisher habe ich folgenden Code geschrieben:

Code:
@echo off
mode con lines=35 cols=100
title Mip-16-1024-a Assembler Compiler

set /p quelle=Pfad der Datei, die kompiliert werden soll:
echo ----------------------------------------------------------------------------------------------------
set /p ziel=Pfad der Datei, in der der kompilierte Code gespeichert werden soll:
cls
echo Wollen sie die Datei "%quelle%" kompilieren und den Code dann in "%ziel%" speichern?
echo ----------------------------------------------------------------------------------------------------
echo J/N
choice /c YJN /N
if errorlevel=3 goto abbruch
if errorlevel=2 goto kompilieren
if errorlevel=1 goto kompilieren

:abbruch
cls
echo Der Vorgang wurde vom Benutzer abgebrochen.
pause >nul
exit

:kompilieren
cls
echo Der Code wird kompilert...
echo ----------------------------------------------------------------------------------------------------
echo Dieser Prozess kann einen Moment dauern.
set line=1


rem In diesem Bereich liegt das Problem, ich weiß, dass die zwei for-Schleifen so nicht funktionieren können.
for /f "tokens=1 delims=2" %%i in ('more/e +%line% ^< %quelle%') do (
  echo %%i
)

FOR /f "usebackq tokens=1 delims=2" %%i in (%quelle%) do (
  echo %%i >>temp.txt
  timeout 1 >nul
  set var=<temp.txt
  echo %var%
)




:end
pause >nul
exit

Also sollen die Befehle in Zahlen umgewandelt werden und die Daten, wenn vorhanden dahinter geschrieben werden oder ggf. durch 0000 ersetzt werden.
Falls Interesse besteht: Der Code soll für eine CPU, die ich in Logisim gebaut habe übersetzt werden und bei längeren Codes ist es doch einfacher, wenn man in Buchstaben und nicht in Zahlen schreiben muss.
Ich hoffe, ich habe mich verständlich ausgedrückt.

Danke für Eure Hilfe!
 
Gibt es einen speziellen Grund, warum es eine .bat sein muss? Ich kenne mich damit nicht wirklich aus, aber so ziemlich jede Programmiersprache wäre dafür problemlos geeignet. Man kann beispielsweise eine Java Klasse dafür bauen und aus dem bat File aufrufen
 
Was hält dich davon ab, etwas mächtigeres als diesen windows batch Kram zu benutzen? Die Befehle in ein assoziatives Array mit den Codes als Werten und dann Zeile für Zeile durcharbeiten dürfte in jeder handelsüblichen Sprache in ein paar Zeilen erledigt sein... python, perl?

Oder du nimmst z.B. gentle und baust dir nen richtigen Compiler ^^
 
1. Du meinst, du hast einen MNemonic Code und willst ihn übersetzt wissen. Klassisches Assembler halt.

2. Man sollte eine Programmiersprache verwenden, die dem Geforderten adäquat gegenüber steht. Ich hätte an deiner Stelle VBS (Win 10 Powershell) oder ooRexX verwendet.

3. Hier handelt es sich, wenn auch in einfacher Form, um einen Compilerbau.

Ich kenne Deinen Wissensstand nicht, aber zuerst definiert man die Sprache. Zu dem Thema an sich und dessen Vorgehen gibt es ja im INet zuhauf Literatur. Du solltest dabei auf eine wohlgeformte Sprache achten. Sonst gibt es im nachhinein massig Probleme. Ich würde als Sprache zumindest eine fortgeschrittene Scriptsprache empfehlen. Ich würde hier, sofern es als Script direkt in der Kommandozeile auszuführen ist, zu RexX greifen. VBS dürfte auch gehen, sofern man ausschließlich unter Win arbeiten möchte.

Dieser Windows Batch Kram ist da aber hoffnungslos überfordert.
 
Zuletzt bearbeitet von einem Moderator: (Schreibfehler)
Ich habe leider nur wenige Kenntnisse in Java & C/C++ durch Schule und Arduino und da ich früher schonmal mit Batch gearbeitet habe, dachte ich, dass das für mich am einfachsten wäre.
 
Seh ich auch so, bevor du dich durch Batch quälst nutz die Zeit und arbeite dich in eine "richtige" Sprache ein. Ich würde mal Python vorschlagen. Java/C# ginge aber genau.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Alrik Wegner
Eine Scriptsprache in petto zu haben, ist definitiv die Einarbeitung wert. Es gibt so viele Problemchen im IT/Entwickler Alltag, die man damit lösen kann, dass dir das sicher immer wieder von Nutzen sein wird. Bei der Wahl kann man nicht allgemein sagen, was besser ist. Jede Sprache hat ihre Spezialitäten, es kommt auf den Anwendungsfall an. Perl und python sind sehr universell einsetzbar.
 
  • Gefällt mir
Reaktionen: Alrik Wegner
letstwistagain schrieb:
Eine Scriptsprache in petto zu haben, ist definitiv die Einarbeitung wert.
Jepp, definitiv. Python wäre auch meine Empfehklung, oder wenn es etwas sein soll das Windows automatisch immer dabei hat: Windows Scripting Host mit JScript (JavaScript ähnlich) oder VB Script.
 
Naja, ich sag mal so. WENN das wie dargestellt eine simple 1-1 Übersetzung ist ("Text in Codewort"), wenn keine Strukturen auflöst, Schleifen ausgerollt oder sonst irgendwie in Abhängigkeit der Eingabe "was anderes" getan werden muß...

... DANN kann man zunächst durchaus erstmal den einfacheren Weg gehen.

Batch ist definitiv nicht die beste Option.

Aber man kann sich sed besorgen. Das gibt es auch für Windows, eigenständig oder als Teil von msys2 (oder, unter 10, im LXSS, wenn man das verwendet).

Dann muß man nur noch per-Befehl ein globales Suchen-und-Ersetzen über die Eingabe laufen lassen: sed -r -e 's,Befehlstext,Codewort,g' < quelldatei > zieldatei.

Das setzt lediglich voraus, daß es eine (ein-)eindeutige Abbildung gibt Text => Codewort. Das ist eine Grundbedingung: ein Befehl für zwei Dinge wäre ein bißchen ungünstig, was zB dann der Fall sein könnte, wenn Befehle kontextabhängig sind. In dem Fall käme man um einen Syntaxparser nicht drumrum.

So kommt man, unter der Annahme daß der Befehlssatz oben vollständig ist, mit maximal 16 Codezeilen für den "Compiler" davon. Der kann dann natürlich nicht mehr - das muß man im Kopf behalten -- aber er ist beliebig mit weiteren Ersetzungbefehlen erweiterbar.
 
Zurück
Oben