Wednesday, Debtember 30, 2015
So how do you determine undefined behavior in a language you are reverse engineering?
I generated a list of all possible commands in INRAC. That was easy enough to do as everything is pretty much separated by spaces. I also resorted to writing my own INRAC programs to play around with some of the odder parts of the language. By doing those things, I'm able to see what various constructs do in order to reverse engineer this bizarre language.
For instance, *6.2&N
.
That's a call to section 6,
lines that have two letter labels where the second letter is “N”.
So,
any of the following lines:
AN boredom 8 bored 7 bore 7 gloom 8 gloomy 8 empty 8 hollow BN stupidity 8 stupid 7 idiot 7 folly 8 silly 7 fool 7 jerk CN feeling 12 feel 7 emotion 7 passion 8 passionate 8 hysterical DN craziness 8 crazy 8 bananas 8 random 8 strange 8 weird DN humor 7 joke 7 jokes EN doubt GN junk 12 stinks 8 cruel 8 useless 8 lousy 8 bad 7 garbage HN idleness 8 lazy 7 loafer 8 easy JN art 8 creative 7 artist 7 life 8 alive ... MP pray 8 holy ...
Assuming it picks “EN”, *6.2&N
will return “doubt”.
But if you change it to *6.4&N
,
and it still picks line “EN” you'll get “doubting”.
Change the second number and you'll get “doubted”,
“doubter” and even “doubtingness”.
In looking at the section header,
this has a (what I'm calling) “parsing value” of 2,
which I think means “this is a list of verbs,
conjugate depending upon second number.”
In the above code snippet, the numbers apply to the word following and inform INRAC of what to return for that part of speech (say for irregular verbs). There also appears to be synonyms thrown in. For instance, I wrote:
X *6MP *6.1MP *6.2MP *6.3MP *6.4MP *6.5MP *6.6MP *6.7MP *6.8MP *6.0MP
And got the following output:
prayes prayes pray prayed praying prayed prayer holiness holy pray
So it appears that the word defined for “.8” also affects the word defined for “.7”. Interesting.
I'm not sure what >31*6.2()47
fully does
(examples from yesterday).
It does set variable 31 to a random conjugated verb in section 6 but I can't determine what else it does.
The parenthesis don't seem to do anything,
nor does the extra number at the end.
I also figured out what !2*11&npr
does.
It sets variable 2 to the output of calling section 11,
lines labeled with a term endig in “npr”.
But it also outputs the section;
>2*11&npr
would just do an assignment with no output.
This bit of weirdness: !2'3'4*11&npr
,
does the same as !2*11&npr
but clears variables 3 and 4.
Go figure.