summaryrefslogtreecommitdiff
path: root/src/GF/GFCC/Raw/PrintGFCCRaw.hs
blob: d46d8096f43e1c56ef8d562d5fa8575e2959697f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
module GF.GFCC.Raw.PrintGFCCRaw (printTree) where

import GF.GFCC.Raw.AbsGFCCRaw

import Data.List (intersperse)
import Numeric (showFFloat)

printTree :: Grammar -> String
printTree g = prGrammar g ""

prGrammar :: Grammar -> ShowS
prGrammar (Grm xs) = prRExpList xs

prRExp :: Int -> RExp -> ShowS
prRExp _ (App x []) = prCId x
prRExp n (App x xs) = p (prCId x . showChar ' ' . prRExpList xs)
    where p s = if n == 0 then s else showChar '(' . s . showChar ')'
prRExp _ (AInt x) = shows x
prRExp _ (AStr x) = showChar '"' . concatS (map mkEsc x) . showChar '"'
prRExp _ (AFlt x) = showFFloat Nothing x
prRExp _ AMet = showChar '?'

mkEsc :: Char -> ShowS
mkEsc s = case s of
  '"'  -> showString "\\\""
  '\\' -> showString "\\\\"
  _    -> showChar s

prRExpList :: [RExp] -> ShowS
prRExpList = concatS . intersperse (showChar ' ') . map (prRExp 1)

prCId :: CId -> ShowS
prCId (CId x) = showString x

concatS :: [ShowS] -> ShowS
concatS = foldr (.) id