I like your idea, I was trying to figure out a way to parse sentences and you pointed me in the right direction.
I used a slightly simplified approach by using pattern sentences:
unlock 1 with 2
The sentences the player types needs to match one of those with the numbers replaced with object names, otherwise it will say "i don't understand" or "I don't know what 'foo' is".
Besides the parsing the game logic is made simple as possible. The command and object names are put into global variables so there are no "tokenat" expressions cluttering it up. The end result is the bare minimum number of conditions to do game logic.
--inventory has "key":
----set text to "you already have the key"
----set text to "you take the key"
----delete "key" from room_objects
----add "key" to inventory
The room objects and inventory are dictionaries. I didn't implement it but room changing is as simple as changing the room objects. You could add room persistence by storing the AsJSON of the room objects somewhere when leaving the room. A save would consist of the room objects of each room and the inventory asJSON.
Only about 15 events for the sentence parsing, the rest was for game content (~30 events).