mirror of
https://github.com/GrammaticalFramework/gf-rgl.git
synced 2026-06-11 16:10:12 -06:00
48 lines
2.2 KiB
Haskell
48 lines
2.2 KiB
Haskell
module ConvertLex where
|
|
|
|
import System.Environment (getArgs)
|
|
import System.Exit (exitFailure)
|
|
import System.IO
|
|
|
|
import Data.List
|
|
import Data.Char
|
|
|
|
main =
|
|
do args <- getArgs
|
|
case args of
|
|
[fname] ->
|
|
do file <- readFile fname
|
|
let newName = "Abs" ++ (reverse $ takeWhile (/= '/') $ reverse fname)
|
|
let rootName = reverse $ drop 3 $ takeWhile (/='/') $ reverse newName
|
|
let absContent = unlines $ map (makeAbstract (\bf pos hd -> bf ++" fun " ++ hd ++ " : " ++ pos ++ " ; ")) (lines file)
|
|
let intContent = unlines $ map (makeAbstract (\bf pos hd -> bf ++ " lin " ++ hd ++ " = " ++ "mkSimpCat" ++ "\"" ++ hd ++ "\" ;")) (lines file)
|
|
let absFile = "abstract " ++ rootName ++ " = AbsToAPI ** { \n\n" ++ absContent ++ "\n\n}"
|
|
let intFile = "incomplete concrete " ++ rootName ++ "I of " ++ rootName ++ " = AbsToAPI ** {\n\n" ++ intContent ++ "\n\n}"
|
|
let concAbs = "concrete " ++ rootName ++ "Abs of " ++ rootName ++ " = AbsToAPIAbs, "++ rootName ++ "I ** {}"
|
|
let concApi = "concrete " ++ rootName ++ "api of " ++ rootName ++ " = AbsToAPIapi, "++ rootName ++ "I ** {}"
|
|
writeFile newName absFile
|
|
putStrLn $ "Wrote file "++ newName
|
|
writeFile (rootName ++ "I.gf") intFile
|
|
putStrLn $ "Wrote file " ++ rootName ++ "I.gf"
|
|
writeFile (rootName ++ "Abs.gf") concAbs
|
|
putStrLn $ "Wrote file " ++ rootName ++ "Abs.gf"
|
|
writeFile (rootName ++ "api.gf") concApi
|
|
putStrLn $ "Wrote file " ++ rootName ++ "api.gf"
|
|
_ -> error "usage ConvertLex file_name"
|
|
|
|
|
|
makeAbstract :: (String -> String -> String -> String) -> String -> String
|
|
makeAbstract fcs str =
|
|
let newss = dropWhile isSpace str
|
|
in
|
|
if isInfixOf "=" newss && isInfixOf ";" newss then
|
|
let hd = head $ words newss
|
|
maybepos = dropWhile (/='_') hd
|
|
pos = if null maybepos then "??" else tail maybepos
|
|
bf = if null maybepos then "--" else ""
|
|
in
|
|
if isInfixOf "flags" newss && bf == "--" then ""
|
|
else fcs bf pos hd
|
|
else ""
|
|
|