#!/usr/bin/env perl # Time-stamp: <2020-07-31 12:00:03 phi> # generate a sentence using a context free grammar use strict; use warnings; my %grammar = # "", "Terminal" ( "S" => [["", "", ""], ["", ""]], "Int" => [["Hi,"], ["Hey,"]], "NP" => [[""], ["", ""]], "Pro" => [["Du"]], "Art" => [["Diese"]], "Noun" => [["Aufgabe"], ["Abgabe"]], "VP" => [["", ""]], "Verb" => [["ist"], ["war"]], "Adj" => [["cool"], ["gut"], ["schön"]] ); sub produce { my $start = shift; my $rules = $grammar{$start}; my $res = ""; my $rule = $rules->[rand(int($#{$rules}) + 1)]; for (my $i = 0; $i <= scalar $#{$rule}; $i++){ my $elem = $rule->[$i]; if ($elem =~ /<(\w+)>/) { $res .= produce($1); } else { $res .= $elem; } $res .= " "; } return $res; } # test: my $result = produce("S"); $result =~ s/ +/ /g; print "$result\n";