classParserError<ExceptionendclassSentencedefinitialize(subject,verb,obj)# remember we take ['noun', 'princess'] pairs and convert them@subject=subject[1]@verb=verb[1]@object=obj[1]endattr_reader:subjectattr_reader:verbattr_reader:objectenddefpeek(word_list)ifword_listword=word_list[0]returnword[0]elseretrunnilendenddefmatch(word_list,expecting)ifword_listword=word_list.shiftifword[0]==expectingreturnwordelsereturnnilendelsereturnnilendenddefskip(word_list,word_type)whilepeek(word_list)==word_typematch(word_list,word_type)endenddefparse_verb(word_list)skip(word_list,'stop')ifpeek(word_list)=='verb'returnmatch(word_list,'verb')elseraiseParserError.new("Expected a verb next.")endenddefparse_object(word_list)skip(word_list,'stop')next_word=peek(word_list)ifnext_word=='noun'returnmatch(word_list,'noun')elsifnext_word=='direction'returnmatch(word_list,'direction')elseraiseParserError.new("Expected a noun or direction next.")endenddefparse_subject(word_list)skip(word_list,'stop')next_word=peek(word_list)ifnext_word=='noun'returnmatch(word_list,'noun')elsifnext_word=='verb'return['noun','player']elseraiseParserError.new("Expected a verb next.")endenddefparse_sentence(word_list)subj=parse_subject(word_list)verb=parse_verb(word_list)obj=parse_object(word_list)returnSentence.new(subj,verb,obj)end