Talen en automaten/2011-12/producten/Omgrofl

Uit Werkplaats
< Talen en automaten‎ | 2011-12‎ | producten
Versie door Erik Barendsen (overleg | bijdragen) op 24 jan 2012 om 10:59
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Ga naar: navigatie, zoeken

Page Break




Algolfrag.jpg

Talen en automaten

Erik Barendsen


 © comments



Omgrofl

Jeftha Spunda, Patrick Tan



Talen en automaten 2011-12



14:55 A






Jeftha Spunda Informatica
 e-mail 

cursuspagina


Patrick Tan Informatica
 e-mail 

cursuspagina

Patrick Tan.jpg

Page Break





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.

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 |