Krautkanal.com

Veröffentlicht am 2016-10-05 23:27:04 in /prog/

/prog/ 9286: IDF: Minimale Skriptsprachen mit regulärer Grammatik

donjain Avatar
donjain:#9286

In diesem Faden entwerfen wir kleine Sprachen mit regulärer Grammatik, zum Skriptieren von Anwendungen oder auch sonst.
Esoterische Sprachen und turingvollständige Teergruben sind erlaubt. OP fängt traditionsgemäß mit was langweiligem an...

Der obligatorische, direkteste imperative Ansatz.

Kann verwendet werden zum Bauen von:
- Testziel für Compiler
- Assemblersimulator
- High-Level DSL
- Irgendwelche Spielskripte, wo man dem Verfasser nicht traut, weil man Skripte übers Internet empfängt
- Ablaufsteuerung

Es existieren drei Elemente:

Kommentare:

> Muss es ja geben.

Sprungmarken:

[eineSprungmarke]

Sprungmarken können von Befehlen angesprungen werden. Ab Werk kann der Sprung auch Marken vor dem Befehl anspringen. Dies kann jedoch deaktiviert werden, um Schleifen zu deaktivieren und auf diesem Weg Endlosschleifen auszuschließen.
Sprungmarken funktionieren wie IDs, jede Sprungmarke muss einen einzigartigen Namen besitzen.

Befehle:

Befehlsname $Parameter1 "Parameter2" @Parameter3

Hinter Befehlen verbirgt sich eine Funktion, die in der Hostsprache programmiert ist und dem Interpreter verfügbar gemacht wird.
Befehle können eine beliebige Anzahl an Parametern entgegen nehmen, das Überprüfen der Werte geschieht in der Hostfunktion.
Es gibt unterschiedliche Typen von Parametern:

- Zahlenwerte
- Wahrheitswerte
- Zeichenketten (verschiedene Literaltypen)
- $symbolische #Namen (zum Implementieren von Referenzen/Variablen, können ggf. beim Parsen ersetzt werden.)
- @Adressen (Name einer Sprungmarke, ggf. beim Parsen ersetzen)

Für den Ersteller der Host-API sollten mindestens folgende Funktionalitäten zur Verfügung stehen:

- Option, um während des Parsens ungewollte Rückwärtssprünge abzufangen
- Einfügen eines Befehls
- Sprung zu angegebener Adresse
- Sprung zu einer beliebigen Instruktionsnummer
- Erhalten der aktuellen Instruktionsnummer
- Beendigung der Ausführung
- API zum Auslesen von Parserfehlern
- Starten ab angegebenen Sprungmarken

So und jetzt zu den interessanten Dingen: Kann Bernd sich mehr so kleine Sprachen ausdenken? Auf anderen Ansätzen basierend, z.B. Automaten?

mrxloka Avatar
mrxloka:#9290

Ohje. Habt ihr Langeweile im Studium? Bernds Versuch:

Meine Sprache hat Register ($0, $1, ..., $9) und einen Stack den man mit den Befehlen Pop, Push und Exch ansteuern kann.

Wenn man eine Funktion definiert, die die Register $0 und $1 verwendet, dann reinigt man zuerst diese Register, indem man die Werte auf den Stack packt und spielt die Werte danach wieder zurück.

Function foo
Push $0
Push $1
# code
Pop $1
Pop $0
FunctionEnd

Neben den Stack Support Befehlen/Instruktion enthält die Sprache auch welche für String Manipulation.

StrCpy $0 "foo bar" # packt den string in den register $0.
StrLen $1 "foo bar" # packt die stringlänge in den register $1.
StrLen $2 $0 # packt die stringlänge von $0 in den register $2.

Zusätzlich bietet Integer Support arithmetische Befehle:

IntOp $0 2 + 3 # packt 5 in den register $0.
IntOp $0 $0 + 1 # packt 6 in den register $0.

Der Programmfluss kann mittels Labels oder Relative Jumps gesteuert werden:

Goto +2 # Springt zwei Zeilen runter.
Goto -3 # Springt drei Zeilen hoch.

IfStart:
Goto IfStart # Springt zur Label IfStart.

String Support kann noch mit Befehlen mit Labels/Flags benutzen abgerundet werden:

StrCmp $0 "foo" ThenLabel ElseLabel

Und um die Definition von Funktionen sowie von Sprungmarken zu vereinfachen könnte man ein Makrosystem einbauen.

!macro foo
# code
!macroend

!insertmacro foo

Die könnte man vielleicht auch irgendwie parametrisieren und mit ${foo} aufrufen, oder so.

Abgekupfert von der assemblerähnlichen Skriptsprache von NSIS.

chanpory Avatar
chanpory:#9291

Addendum >>9290

Labels in der Form [Label] zu schreiben ist übrigens eine vorzügliche Idee.

stushona Avatar
stushona:#9292

>>9290
>Ohje. Habt ihr Langeweile im Studium?
Ja! Ist ja auch scheisse, aber wenigstens hat man noch Zeit zum Scheißpostieren!
Bernd will unter anderem auch sehen, was man mit regulären Grammatiken machen kann. Das man damit nicht mal reguläre Ausdrücke parsen kann, hat ihn etwas unterwellt.

>Bernds Versuch
Kuhl Bernd. Lässt sich sogar in der Metasprache aus dem Originalpfosten implementieren, wenn man von den anderen Labels absieht. Makros findet Bernd klasse, wenn sie Teil des Interpreters sind.

Allerdings fragt sich Bernd nun, warum das so ähnlich für ein Installationsskript genutzt wird. Was ist mehr Schmerz: WichsWIX oder NSIS?

>9291
Hat Bernd von INI-Dateien und Annotations geklaut. Davor hat er auch erst an Doppelpunkte gedacht, wie in normalen Labeln und escript.

antongenkin Avatar
antongenkin:#9297

Mit regulären Grammatiken kann man NICHTS machen, habt ihr das im Studium nicht gelernt?

>Register
>Schleifen
>Rumzählen
>Labels

Meine Seiten!

Hab gehört Leute schwören auf Lua. Ist natürlich aber nicht regulär.

albertodebo Avatar
albertodebo:#9298

>>9297
Ist aber nicht Thema dieses Fadens.

chaabane_wail Avatar
chaabane_wail:#9300

>>9297
Ich glaube, du verwechselst da was. Die meisten Assembler verarbeiten reguläre Grammatiken (eventuelle Makrokonstrukte mal ausgenommen) und trotzem funktionieren alle von dir erwähnten Dinge.

Und Labels sind eher eine Sache der semantischen Analyse und nicht der Grammatik.

subburam Avatar
subburam:#9306

Ähm, nö.

Sobald du einen Constraint hast wie "label bei goto muß auch existieren" ist das Dings nicht meer regulär, weil ein DEA kein Gedächtnis hat.

Bekannte Nochnandre Compilercompiler arbeiten auf ner speziellen Teilmenge (LALR) von Typ1 oder so Sprachen, und die Constraints werden dann durch doma.y nspezifischen Kot eingepflegt.

Aber du hast recht, Bernd dachte die damit bewirkten Magien sollten regulär sein, nicht die Sprache in der man sie codiert. Also wie grep.

splashing75 Avatar
splashing75:#9307

>>9306
Dieser Pfosten, sowie der gesamte Faden, sind ein neuer Tiefpunkt dieses Unterbrettes.

urbanjahvier Avatar
urbanjahvier:#9309

>>9307>>9307>>9307
Hallo Neufreund.

Neuste Fäden in diesem Brett: