<< Demo045 >> << Section 6.4: Syntax Analysis >> use TextInput, LexicalAnalysis; component SyntaxAnalysis; type ParseTree = term; Parse(text) -> optional(ParseTree); begin type Phrase = sequence; type RestPhrase = Phrase; nil = null(Phrase); Sentence(ParseTree,ParseTree) => ParseTree; NounPhrase(ParseTree,ParseTree) => ParseTree; VerbPhrase(ParseTree,ParseTree) => ParseTree; Determiner(text) => ParseTree; Noun(text) => ParseTree; Verb(text) => ParseTree; Parse(text) -> optional(ParseTree); Parse(Text) = [ End:= null(sequence); sentence(tokenize(Input(Text)),var(End))]; sentence(Phrase, var(RestPhrase)) -> optional(ParseTree); sentence(Start, End) = [ Middle:= Start; Sentence(noun_phrase(Start, var(Middle)), verb_phrase(Middle, var(End))) ]; noun_phrase(Phrase, var(RestPhrase)) -> optional(ParseTree); noun_phrase(Start,End) = [ Middle:= Start; ( NounPhrase(determiner(Start, var(Middle)), noun(Middle, var(End))), NounPhrase(null(ParseTree), noun(Start,var(End))))]; verb_phrase(Phrase, var(RestPhrase)) -> optional(ParseTree); verb_phrase(Start,End) = [ Middle:= Start; ( VerbPhrase(verb(Start, var(Middle)), noun_phrase(Middle, var(End))), VerbPhrase(verb(Start,var(End)), null(ParseTree))) ]; determiner(Phrase, var(RestPhrase)) -> optional(ParseTree); determiner(=nil, Rest) = no(ParseTree); determiner("a" & Tail, Rest) = [ Rest:=Tail; Determiner("a")]; determiner("the" & Tail, Rest) = [ Rest:=Tail; Determiner("the")]; determiner("all" & Tail, Rest) = [ Rest:=Tail; Determiner("all")]; determiner("some" & Tail, Rest) = [ Rest:=Tail; Determiner("some")]; noun(Phrase, var(RestPhrase)) -> optional(ParseTree); noun(=nil, Rest) = no(ParseTree); noun("man" & Tail, Rest) = [ Rest:=Tail; Noun("man")]; noun("apple" & Tail, Rest) = [ Rest:=Tail; Noun("apple")]; noun("boy" & Tail, Rest) = [ Rest:=Tail; Noun("boy")]; noun("stone" & Tail, Rest) = [ Rest:=Tail; Noun("stone")]; noun("Jack" & Tail, Rest) = [ Rest:=Tail; Noun("Jack")]; verb(Phrase, var(RestPhrase)) -> optional(ParseTree); verb(=nil, Rest) = no(ParseTree); verb("sings" & Tail, Rest) = [ Rest:=Tail; Verb("sings")]; verb("eats" & Tail, Rest) = [ Rest:=Tail; Verb("eats")]; verb("throws" & Tail, Rest) = [ Rest:=Tail; Verb("throws")]; end component SyntaxAnalysis; Parse("the boy throws a stone")? Parse("boy throws a stone")? Parse("boy throws")? Parse("cow throws")?