模块 GF.编译 (编译到PGF, 链接, 批处理编译, srcAbs名称) 哪里

进口 GF.编译。格拉玛ToPGF(mk第2页)
进口 GF.文件。读取文件(ModEnv公司,从文件中获取选项,获取所有文件,
                            导入模块)
进口 GF.CompileOne公司(compileOne(编译一))

进口 GF.语法。语法(语法,空语法,
                          混凝土文摘,prepend模块)--,msrc,模块

进口 GF.参考。标识(模块名称,模块名称S)--,显示ID
进口 GF.参考。选项
进口 GF.参考。UseIO(使用IO)(IOE公司,完整路径,提升(liftIO),获取库目录,putIfVerb(输入动词),
                      仅模块名称,扩展路径环境,putStrE(输入StrE),输入点E)
进口 GF.数据。操作(提升,(+++),错误)

进口 控制。莫纳德(foldM(折叠M),什么时候,(<=<),过滤器M,提升M)
进口 GF.系统。号码簿(does文件存在,获取修改时间)
进口 系统。文件路径((</>),是相对的,dropFileName)
进口 有资格的 数据。地图 作为 地图(空的,插入,电子元件) --查找
进口 数据。列表(结节)
进口 数据。时间(UTC时间)
进口 GF.文本。很漂亮(提供,($$),(<+>),)

进口 PGF公司。内部(优化PGF)
进口 前列腺素F(前列腺素F,默认概率,设置概率,从文件读取概率)

--|编译大量源文件并为其构建“PGF”结构。
--这是“link”和“batchCompile”的组合。
编译到PGF :: 选项 -> [文件路径] -> IOE公司 前列腺素F
compileToPGF::选项->[文件路径]->IOE PGF编译到PGF 选项opts选项 [文件路径]英尺 = 选项->(模块名称,语法)->IOE PGF链接 选项opts选项 ((模块名称,语法)->IOE PGF)->(((UTC时间,(模块名称,语法))->(模块名称、语法))->(UTC时间,(模块名称,语法))->IOE PGF公司对于所有的b c a。(b->c)->(a->b)->a->c. (UTC时间,(模块名,语法))->(模块名称,语法)对于所有a b.(a,b)->b信噪比 ((UTC时间,(模块名称,语法))->IOE PGF)->IO(UTC时间,(模块名称,语法))->IOE PGF对于所有(m::*->*)a b.Monad m=>(a->mb)->ma->mb=<< 选项->[FilePath]->IO(UTCTime,(ModuleName,Grammar))批处理编译 选项opts选项 [文件路径]英尺

--|将语法链接到可用于“PGF.linearize”和
--使用“PGF”运行时系统进行“PGF.parse”。
链接 :: 选项 -> (模块名称,语法) -> IOE公司 前列腺素F
链接::选项->(模块名称,语法)->IOE PGF链接 选项opts选项 (模块名称数控,语法) =
  详细信息->选项->文件路径->IOE PGF->IOE PGF对于所有(m::*->*)b。(输出m,MonadIO m)=>详细信息->选项->文件路径->m b->m b输入点E 详细正常 选项opts选项 文件路径“正在链接…” (IOE PGF->IOE PGF)->IOE PGF->IOE PGF对于所有a b(a->b)->a->b$ 
     abs::模块名称防抱死制动系统 = 语法->模块名称->模块名称srcAbs名称 语法 模块名称数控
    前列腺素F前列腺素f <- 选项->语法->模块名称->IOE PGFmkCanon2页 选项opts选项 语法 模块名称防抱死制动系统
    可能性问题 <- IO概率->IO概率对于所有(m::*->*)a.MonadIO m=>IO a->ma提升(liftIO) ((PGF->IO概率)->(文件路径->PGF->IO概率)->可能是文件路径->前列腺素F->IO概率对于所有的ba.b->(a->b)->也许a->b也许 (概率->IO概率对于所有(m::*->*)a.莫纳德m=>a->m a返回 (概率->IO概率)->(PGF->概率)->PGF->IO概率对于所有的b c a。(b->c)->(a->b)->a->c. PGF->概率默认概率) 文件路径->PGF->IO概率从文件读取概率 ((标志->Maybe FilePath)->选项->MaybeFilePath对于所有a.(标志->a)->选项->a旗帜 标志->可能的文件路径optProbs文件 选项opts选项) 前列腺素F前列腺素f)
    Bool->IO()->IO()对于所有(f::*->*)。适用f=>Bool->f()->f()什么时候 (选项->详细->Boolverb至少 选项opts选项 详细正常) (IO()->IO())->IO对于所有a b(a->b)->a->b$ 文件路径->IO()所有(m::*->*)。输出m=>文件路径->m()putStrE(输入StrE) 文件路径“确定”
    PGF->IOE PGF对于所有(m::*->*)a.Monad m=>a->ma返回 (PGF->IOE PGF)->PGF->IO PGF对于所有a b(a->b)->a->b$ 概率->PGF->PGF设置概率 可能性问题 
           (PGF->PGF)->PGF->PGF对于所有a b(a->b)->a->b$ 如果 (标志->Bool)->选项->Bool对于所有a.(标志->a)->选项->a旗帜 标志->布尔选择优化PGF 选项opts选项 然后 PGF->PGF优化PGF 前列腺素F前列腺素f 其他的 前列腺素F前列腺素f

--|返回与命名的具体语法相对应的抽象语法的名称
srcAbsName::语法->模块名称->模块名称srcAbs名称 语法 模块名称数控 = (文件路径->模块名称)->(模块名称->模块名称)->错误模块名称->模件名称对于所有b a.(文件路径->b)->(a->b)->错误a->b错误 (模块名称->文件路径->模块名称对于所有a b.a->b->a常数 模块名称数控) 模块名称->模块名称对于所有a.a->a身份证件 (错误模块名称->模块名称)->错误模块名称->ModuleName对于所有a b(a->b)->a->b$ 语法->模块名称->错误模块名称所有(m::*->*)。错误消息m=>语法->模块名称->m模块名称混凝土文摘 语法 模块名称数控

--|编译给定的语法文件及其依赖的所有内容。
--编译的模块存储在@.gfo@文件中(除非@-tags@选项是
--使用,在这种情况下,将生成标记文件)。
--现有的@.gfo@文件如果是最新的,则会被重用
--(除非使用选项@-src@aka@-force-recomp@)。
批处理编译 :: 选项 -> [文件路径] -> IOE公司 (UTC时间,(模块名称,语法))
batchCompile::选项->[FilePath]->IO(UTCTime,(ModuleName,Grammar))批处理编译 选项选择 [文件路径]文件夹 = 
  (语法,ModEnv公司菜单) <- ((语法,ModEnv)->文件路径->IO(语法,ModEnv))->(语法,ModEnv)->[文件路径]->IO(语法,ModEnv)对于所有(t::*->*)(m::*->*)b a。(可折叠t,单体m)=>(b->a->mb)->b->ta->mbfoldM(折叠M) (选项->(语法,ModEnv)->文件路径->IO(语法,ModEnv)编译模块 选项opts选项) (语法,ModEnv)空编译环境 [文件路径]文件夹
   cnc::模块名称数控 = 文件路径->模块名称模块名称S (文件路径->文件路径仅模块名称 ([FilePath]->文件路径对于所有a.[a]->a最后的 [文件路径]文件夹))
      t::UTC时间t吨 = [UTC时间]->UTC时间对于所有(t::*->*)a.(可折叠t,Ord a)=>t a->a最大限度 ([UTC时间]->UTC时间)->([(UTCTime,[FilePath])]->[UTCTime])->[(UTC时间,[文件路径])]->UTC时间对于所有的b c a。(b->c)->(a->b)->a->c. ((UTC时间,[文件路径])->UTC时间)->[(UTCTime,[FilePath])]->[UTCTime]对于所有a b.(a->b)->[a]->[b]地图 (UTCTime,[FilePath])->UTCTime对于所有a b(a,b)->a有限状态试验 ([(UTCTime,[FilePath])]->UTCTime)->[(UTC时间,[文件路径])]->UTC时间对于所有a b(a->b)->a->b$ ModEnv->[(UTC时间,[文件路径])]对于所有k a。映射k a->[a]地图.elems ModEnv公司菜单
  (UTC时间,(模块名称,语法))->IO(UTC时间,(模块名称,语法))对于所有(m::*->*)a.Monad m=>a->ma返回 (UTC时间t吨,(模块名称数控,语法))
{---编译一组模块,例如旧的GF或.cf文件compileSourceGrammar::选项->语法->IOE语法compileSourceGrammar opts gr=docwd<-getCurrentDirectory(_,gr',_)<-foldM(\env->compileSourceModule opts cwd-env-Nothing)空编译环境(模块gr)返回gr'-}

--|以一个模块为起点编译
--命令行选项覆盖文件中的选项(用--#标记)
--至于路径:如果它是从文件中读取的,则在每个名称前面加上文件路径。
--如果从命令行,则按原样使用。

编译模块 :: 选项 --^程序命令行和shell命令中的选项。
              -> 编译环境 -> 文件路径 -> IOE公司 编译环境
编译模块::选项->(语法,ModEnv)->文件路径->IO(语法,ModEnv)编译模块 选项选项1 env::(语法,ModEnv)环境价值@(语法_,ModEnv公司射频) 文件路径文件 =
   文件路径文件 <- 文件路径->IO文件路径所有(m::*->*)。(MonadIO m,输出m,错误Monad m)=>文件路径->m文件路径获取真实文件 文件路径文件
     选项选项0 <- 文件路径->IO选项所有(m::*->*)。(错误Monad m,MonadIO m)=>文件路径->m选项从文件中获取选项 文件路径文件
      当前目录::文件路径当前目录(_D) = 文件路径->文件路径删除文件名 文件路径文件
     [文件路径]库目录 <- 选项->IO[FilePath]所有(io::*->*)。MonadIO io=>选项->io[FilePath]获取库目录 (选项->选项->选项添加选项 选项选项0 选项选项1)
      opts::选项opts选项 = 选项->选项->选项添加选项 (文件路径->[文件路径]->选项->选项修复相对库路径 文件路径当前目录(_D) [文件路径]库目录 选项选项0) 选项选项1
--putIfVerb选择$“curr_dir:”+++显示curr_dir----
--putIfVerb选择$“lib_dir:”+++显示lib_dir----
     [文件路径]磅/平方英寸 <- 选项->IO[FilePath]所有(io::*->*)。MonadIO io=>选项->io[FilePath]扩展路径环境 选项opts选项
      ps::[文件路径] = [文件路径]->[文件路径]对于所有a.等式a=>[a]->[a]结节 (文件路径当前目录(_D) 文件路径->[FilePath]->[FilePath]对于所有a.a->[a]->[a]: [文件路径]磅/平方英寸)
--putIfVerb opts$“options from file:”++显示opts0
--putIfVerb opts$“增强选项:”++显示选项
     选项->文件路径->IO()对于所有(f::*->*)。输出f=>选项->文件路径->f()putIfVerb(输入动词) 选项opts选项 (文件路径->IO())->文件路径->I/O()对于所有a b(a->b)->a->b$ 文件路径“模块搜索路径:” FilePath->FilePath->文件路径+++ [FilePath]->文件路径for all a.显示a=>a->FilePath显示 [文件路径] ----
     [文件路径]文件夹 <- 选项->[FilePath]->ModEnv->FilePath->IO[FilePath]所有(m::*->*)。(错误Monad m,MonadIO m,输出m)=>选项->[FilePath]->ModEnv->FilePath->m[FilePath]获取所有文件 选项选择 [文件路径] ModEnv公司无线射频系统 文件路径文件
     选项->文件路径->IO()对于所有(f::*->*)。输出f=>选项->文件路径->f()putIfVerb(输入动词) 选项opts选项 (文件路径->IO())->文件路径->I/O()对于所有a b(a->b)->a->b$ 文件路径“要读取的文件:” FilePath->FilePath->文件路径+++ [FilePath]->文件路径for all a.显示a=>a->FilePath显示 [文件路径]文件夹 ----
      名称::[文件路径]姓名 = (文件路径->文件路径)->[FilePath]->[FilePath]对于所有a b.(a->b)->[a]->[b]地图 文件路径->文件路径仅模块名称 [文件路径]文件夹
     选项->文件路径->IO()对于所有(f::*->*)。输出f=>选项->文件路径->f()putIfVerb(输入动词) 选项opts选项 (文件路径->IO())->文件路径->I/O()对于所有a b(a->b)->a->b$ 文件路径“要包含的模块:” FilePath->FilePath->文件路径+++ [FilePath]->文件路径for all a.显示a=>a->FilePath显示 [文件路径]姓名 ----
     ((语法,ModEnv)->文件路径->IO(语法,ModEnv))->(语法,ModEnv)->[文件路径]->IO(语法,ModEnv)对于所有(t::*->*)(m::*->*)b a。(可折叠t,单体m)=>(b->a->m b)->b->t a->m b折叠M (选项->(语法,ModEnv)->文件路径->IO(语法,ModEnv)compileOne’ 选项opts选项) (语法,ModEnv)环境价值 [文件路径]文件夹
  哪里
    getRealFile::FilePath->m文件路径获取真实文件 文件路径文件 = 
      布尔存在 <- 文件路径->m Bool所有(m::*->*)。MonadIO m=>文件路径->m Booldoes文件存在 文件路径文件
      如果 布尔存在
        然后 文件路径->m文件路径对于所有(m::*->*)a.Monad m=>a->ma返回 文件路径文件
        其他的 如果 文件路径->Bool是相对的 文件路径文件
               然后 
                       [文件路径]库目录 <- 选项->m[FilePath]所有(io::*->*)。MonadIO io=>选项->io[FilePath]获取库目录 选项选项1
                        候选::[FilePath]候选人 = [ 文件路径库目录(_D) FilePath->FilePath->文件路径</> 文件路径文件 | 文件路径库目录(_D) <- [文件路径]库目录 ]
                       选项->文件路径->m()对于所有(f::*->*)。输出f=>选项->文件路径->f()putIfVerb(输入动词) 选项选项1 (文档->文件路径对于所有a.相当于a=>a->FilePath提供 (文件路径“正在查找:” 文件路径->单据->单据对于所有a1a2。(Pretty a1,Pretty a2)=>a1->a2->文档$$ Int->[FilePath]->文档对于所有a.漂亮a=>Int->a->Doc 国际2 [文件路径]候选人))
                       [文件路径]文件1 <- (文件路径->m Bool)->[文件路径]->m[文件路径]对于所有(m::*->*)a。适用m=>(a->m Bool)->[a]->m[a]过滤器M 文件路径->m Bool所有(m::*->*)。MonadIO m=>文件路径->m Booldoes文件存在 [文件路径]候选人
                       案例 [文件路径]->Int对于所有(t::*->*)a.可折叠t=>t a->Int长度 [文件路径]文件1 属于
                         国际0 -> 文件路径->m文件路径对于所有(m::*->*)a.ErrorMonad m=>FilePath->m a提升 (文档->文件路径对于所有a.相当于a=>a->FilePath提供 (文件路径“找不到:” 文件路径->文档->文档对于所有a1a2。(Pretty a1,Pretty a2)=>a1->a2->文档$$ Int->[文件路径]->文档对于所有a.相当a=>Int->a->Doc 国际2 [文件路径]候选人))
                         国际1 ->  文件路径->m文件路径对于所有(m::*->*)a.Monad m=>a->ma返回 (文件路径->m文件路径)->文件路径->m文件路径对于所有a b(a->b)->a->b$ [FilePath]->文件路径对于所有a.[a]->a [文件路径]文件1
                         国际_ ->  选项->文件路径->m()对于所有(f::*->*)。输出f=>选项->文件路径->f()putIfVerb(输入谓词) 选项选项1 (文件路径“匹配多个候选人:” FilePath->FilePath->文件路径+++ [FilePath]->文件路径for all a.显示a=>a->FilePath显示 [文件路径]文件1)
                                 文件路径->m文件路径对于所有(m::*->*)a.Monad m=>a->ma返回 (文件路径->m文件路径)->文件路径->m文件路径对于所有a b(a->b)->a->b$ [FilePath]->文件路径对于所有a.[a]->a [文件路径]文件1
               其他的 文件路径->m文件路径对于所有(m::*->*)a.ErrorMonad m=>FilePath->m a提升 (文档->文件路径对于所有a.相当于a=>a->FilePath提供 (文件路径“文件” 文件路径->文件路径->文档对于所有a1a2。(Pretty a1,Pretty a2)=>a1->a2->文档<+> 文件路径文件 文件->文件路径->文件对于所有a1a2。(Pretty a1,Pretty a2)=>a1->a2->文档<+> 文件路径“不存在”))

compileOne’ :: 选项 -> 编译环境 -> 完整路径 -> IOE公司 编译环境
compileOne::选项->(语法,ModEnv)->文件路径->IO(语法,ModEnv)compileOne’ 选项opts选项 env::(语法,ModEnv)环境价值@(语法,ModEnv公司_) = (语法,ModEnv)->(可能是文件路径、模块)->IO(语法、ModEnv)对于所有(m::*->*)。MonadIO m=>(语法,ModEnv)->(可能是文件路径,模块)->m(语法,ModEnv)扩展编译环境 (语法,ModEnv)环境价值 ((可能是文件路径、模块)->IO(语法、ModEnv))->(文件路径->IO(可能是文件路径、模块))->文件路径->IO(语法,ModEnv)对于所有(m::*->*)b c a。单体m=>(b->mc)->(a->mb)->a->mc<=< 选项->语法->文件路径->IO(可能是文件路径、模块)所有(m::*->*)。(输出m、ErrorMonad m、MonadIO m、Monad Fail m)=>选项->语法->文件路径->m(可能是文件路径、模块)compileOne(编译一) 选项opts选项 语法

--辅助设备

--|环境
类型 编译环境 = (语法,ModEnv公司)

空编译环境 :: 编译环境
emptyCompileEnv::(语法,模式环境)空编译环境 = (语法空语法,ModEnv公司for all k a.映射k a地图.空)

extendCompileEnv::(语法,ModEnv)->(可能是文件路径,模块)->m(语法,ModEnv)扩展编译环境 (语法,ModEnv公司菜单) (可能是文件路径mfile文件,模块瞬间) =
   ModEnv公司男性2 <- 案例 可能是文件路径m文件 属于
                只是 文件路径文件 ->
                    (文件路径国防部,[文件路径]小鬼) = 模块->(FilePath,[FilePath])导入模块 模块瞬间
                     UTC时间t吨 <- 文件路径->m UTC时间所有(m::*->*)。MonadIO m=>文件路径->m UTC时间获取修改时间 文件路径文件
                     ModEnv->m ModEnv对于所有(m::*->*)a.Monad m=>a->ma返回 (ModEnv->m ModEnv)->ModEnv->m ModEnv-对于所有a b(a->b)->a->b$ 文件路径->(UTCTime,[FilePath])->ModEnv->ModEnv对于所有k a。Ord k=>k->a->Map k a->Map k地图插入 文件路径国防部 (UTC时间t吨,[文件路径]小鬼) ModEnv公司菜单
                可能是文件路径_ -> ModEnv->m ModEnv对于所有(m::*->*)a.Monad m=>a->ma返回 ModEnv公司菜单
     (语法,ModEnv)->m(语法,ModEnv)对于所有(m::*->*)a.Monad m=>a->ma返回 (语法->模块->语法prepend模块 语法 模块瞬间,ModEnv公司菜单2)