This program converts a dictionary containing linear pronunciation models into a dictionary of pronunciation networks (Chapter~\ref{ch:Pronunciations}). That is, it takes a dictionary with entries in the format \begin{alltt} A AX ABLE EY B EL ABLY EY B L IY \vdots \end{alltt} and produces a dictionary with entries in the format \begin{alltt} A 1 [1] [1] 1 AX [] ABLE 3 [1] [3] 1 EY [] 2 B [1] 3 EL [2] ABLY 4 [1] [4] 1 EY [] 2 B [1] 3 L [2] 4 IY [3] \vdots \end{alltt} \begin{haskell}{ConvertLinearDic} > module Main where > import Phones > main = getArgs exit $ \args -> > case args of > [linear_dic_file] -> let > outfile = linear_dic_file ++ ".dgs" > in > readFile linear_dic_file exit $ \cs -> > writeFile outfile (process cs) exit $ > appendChan stderr ( > "Output written to " ++ outfile ++ > "\n") exit done > > _ -> error usage > usage = "usage: ConvertLinearDic " \end{haskell} In a ``linear'' dictionary, there is one entry per line. The function \verb~readLinearEntry~ reads one line. \begin{verbatim} > type LinearEntry = (String, [Phone]) > readLinearEntry :: String -> LinearEntry > readLinearEntry l = (w, ps) > where (w:pls) = words l > ps = map read pls > process :: String -> String > process = concat . map (build_and_show_dg . readLinearEntry) . lines > build_and_show_dg :: LinearEntry -> String > build_and_show_dg (w,ps) = > let > num_nodes = length ps > term_nodes = [num_nodes] > node_lines = map show_node_line ( > zip3 [1..] ps ([] : [[k] | k <- [1..]]) ) > in > w ++ "\n" ++ > show num_nodes ++ " [1] " ++ show term_nodes ++ "\n" ++ > unlines node_lines ++ "\n" > show_node_line (k, p, ps) = > show k ++ "\t" ++ show p ++ "\t" ++ show ps \end{verbatim}