dram.me

Trealla源码分析:整体执行流程

补遗

在添加直接从STDIN解析代码功能中,lexer_consult分拆lexer_consult_filelexer_consult_fp两个函数,trealla_consult_file调用的是前者。—— 2016-12-16

Trealla是一个Prolog语言实现,有大量借鉴Erlang的思想,轻量级线程等。

tpl.c是Trealla的入口文件(猜测tpl是Trealla Prolog的缩写,类似于SWI Prolog对主程序swipl的命名思路)。

从总体来看,Trealla的执行代码包括两种方式:一是执行(consult)文件,再是执行查询(query)。两者都可以在tpl.c中找到相应入口。

执行查询的逻辑体现在对--goal参数以及REPL的处理中,主要包括以下流程:

  1. trealla_create_query创建查询;

  2. query_parse解析查询;

  3. query_run执行查询;

  4. 通过query_choices判断如果可能存在多个结果,则会提示下一步动作,例如利用query_trace切换是否打印trace,query_continue获取可能存在的下一个结果;

  5. query_destroy回收资源。

而执行文件的入口函数则是在tpl.c中调用的trealla_consult_file函数,tpl以此处理在命令行中指定的文件。函数的具体实现在src/trealla.c中,其中包括如下操作:

  1. 创建并经由lexer_init初始化词法解析器;

  2. 调用lexer_consult解析源码文件;

  3. 经由add_clauses将解析所得语句加入数据库;

  4. 如果Trealla解释器的init属性在词法解析过程中经由initialization指令设置,则作为查询语句调用trealla_run_query执行;

  5. lexer_done回收解析器资源。

trealla_run_query的流程与上述查询的执行流程基本一致,最大的差异是没有交互式选择choice的过程。