Talen en automaten/2011-12/producten/Omgrofl
Omgrofl
Jeftha Spunda, Patrick Tan
Talen en automaten 2011-12
14:55 A |
Link naar het downloadbare bestand:
https://lab.cs.ru.nl/algemeen/images/d/db/Case_study_Talen_en_Automaten.pdf
We hebben echter ook een direct leesbare versie hieronder.
Inhoud
Omgrofl
De taal die wij bestuderen voor deze case study is Omgrofl: een esoterische programmeertaal gecreëerd door Juraj Borza in 2006.
Juraj Borza
Juraj Borza, de ontwerper van Omgrofl is geboren in Bratislava, de hoofdstad van Slowakije. Hij is de stichter van Borza industries, een bedrijf dat android applicaties maakt. Momenteel woont hij in Svätý Jur, een kleine stad gelegen in centraal Slowakije. Hij is werkzaam geweest als technical editor voor PC Revue magazin en werkt nu als ontwikkelaar voor MicroStep. Naast Omgrofl heeft hij ook ReverseFuck gemaakt. Wat betreft het maken van software zegt hijzelf dat de beste software ontstaat uit een behoefte aan iets.
Omgrofl
Deze taal maakt gebruik van internet-slang. Internet slang is in principe de straattaal van het internet. Het kenmerkt zich doordat het meestal afkortingen zijn bedoeld om minder lange woorden in te hoeven toetsen. Enkele voorbeelden zijn “LOL,” “OMG”, “LMAO” en “FYI”. Sommige woorden worden inmiddels ook buiten het internet gebruikt. Linguïstisch gezien zijn de woorden die acties beschrijven meestal zelf reflectief in plaats van een werkelijke beschrijving van wat de persoon die het stuurt doet. Iemand die “ROTFLMAO” intoetst rolt in werkelijkheid niet luid lachend over de vloer. Omgrofl gebruikt een stack/queue die te vergelijken is met de tape op een türingmachine. Vandaar dat de taal Türing-compleet is. Een Omgrofl programma bestaat uit regels met op elke regel één commando. Witregels en een tweede commando op een regel worden genegeerd. Daarnaast is Omgrofl niet hoofdlettergevoelig.
Commando’s
Om te beginnen moet een variabele in Omgrofl een vorm zijn van het woord “lol”. De variabele naam moet dus beginnen met “l”, gevolgd door een willekeurig aantal “o’s”, gevolgd door een “l”. (Dit is direct al een indicatie dat de taal niet-regulier is. Hier komen we later op terug)
Om output te printen wordt gebruik gemaakt van het “rofl variabele naam”-commando.
“wtf” is een commando vergelijkbaar met “if” uit C. wtf wordt gevolgd door een aantal expressies die uitgevoerd worden wanneer de voorwaarde geldt. De wtf eindigt met het “brb” commando. brb is hier vergelijkbaar met de sluitende accolade in C.
“iz uber” vergelijkt twee variabelen en bekijkt of de een groter is dan de ander.
“iz liek” kijkt of twee variabelen aan elkaar gelijk zijn of niet.
Voor loops gebruikt Omgrofl het commando “rtfm”. De loop die hiermee wordt aangeroepen is vergelijkbaar met while(true) in C. Dit betekent dat de loop met een soort van break-command moet worden getermineerd. Dit gebeurt met het “tldr”-commando.
Na rtfm volgt een aantal expressies gevolgd door brb. (Hier weer fungerend als de sluitende accolade)
Commentaarregels worden gestart met het “w00t” –commando. Vergelijkbaar met “//” in C.
Om een variabele met 1 te verhogen wordt “lmao variabale naam” gebruikt. Om 1 te verlagen “roflmao variabele naam”.
Pauzeren wordt gedaan met het “afk miliseconden”- commando
“stfu” termineert het programma.
Twee voorbeelden
Hello, World!
w00t a Hello, World! program by poiuy_qwert
lol iz 72
rofl lol
lol iz 101
rofl lol
lol iz 108
rofl lol
rofl lol
lool iz 111
rofl lool
loool iz 44
rofl loool
loool iz 32
rofl loool
loool iz 87
rofl loool
rofl lool
lool iz 114
rofl lool
rofl lol
lol iz 100
rofl lol
lol iz 33
rofl lol
stfu
De cijfers komen overeen met de ascii-waarden van de karakters die nodig zijn
om ‘Hello World!’ te spellen.
Bij elkaar optellen van 2 getallen
loool iz lol
looooool iz lool
rtfm
wtf looooool iz liek 0
tldr
brb
lmao loool
roflmao looooool
brb
Hetzelfde maar dan in C:
loool = lol;
looooool = lool;
while (true)
{
if (looooool == 0)
break;
loool++;
looooool--;
}
Bewijs niet-regulier
Pomplemma voor reguliere talen kan niet succesvol toegepast worden op Omgrofl.
Stel dat onze taal regulier is. Dan is er een automaat met k states die onze taal accepteert.
In Omgrofl is het zo dat een variabele naam met slechts één ‘l’ mag beginnen gevolg door een aantal o’s gevolg door nogmaals één ‘l’. Een variabele naam is dus van deze vorm
w = lokl
Dit woord komt overeen hiermee:
w = loillojllok-i-jl met u = loil, v = lojl en w = lok-i-jl
Wanneer we een substring van de vorm uvw pompen, ontstaat uv2w = loillojllojllok-i-jl = lojllokl en dit woord zit niet meer in de taal.
Het toepassen van pomplemma heeft geresulteerd in een contradictie onverenigbaar met reguliere talen. Hieruit kan geconcludeerd worden dat Omgrofl een niet-reguliere taal is.
Bewijs context-vrij
De taal Omgrofl is contextvrij, wat inhoudt dat de taal gedefinieerd kan worden door een context-vrije grammatica. Nou is het wat lastig om de gehele taal in een context-vrije grammatica te omvatten, dus hier volgt een deel.
Elke S betekent hier een nieuw commando.
S -> VAR S | PRINT S | COMMENT S | PAUSE S | LOOP S brb | LOOP S tldr brb | wtf CONDITION | lmao VARN | roflmao VARN | stfu
VAR -> VARN iz INT
VARN -> lOl
O -> oO | o
INT -> 1 INT | 2 INT | … | 9 INT | 1 | 2 | … | 0
PRINT -> rofl VAR
COMMENT -> w00t TEXT
TEXT -> a STRING | b STRING | … |z STRING | a | b | … | z | 1 STRING | 2 STRING | … | 0 STRING | 1 | 2 | … | 0 | ! STRING | @ STRING | … | + STRING | ! | @ | … | + |
PAUSE -> afk INT
LOOP -> rtfm | rtfm VARN 2 VARN | rtfm VARN 2 INT | rtfm INT 2 VARN | rtfm INT 2 INT
CONDITION -> VARN iz liek INT | VARN iz uber VARN | VARN iz nope VARN | VARN iz uber INT | VARN iz nope INT | INT iz uber VARN | INT iz nope VARN |