【源码分析】Strawberry Prolog 5.0 源码分析

任云瀚
2023-12-01

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 

前言

介绍 Prolog IDEs 的很多,但是专门介绍 Strawberry Prolog 的文章几乎没有。不要看它的官方网站还是上世纪的风格,也没有什么移动版视图,但是其到2020年1月23日仍有更新,推出了5.0版本的二进制包,相应地提供了其源码包。自 3.0 Beta 4 推出的示例小游戏 WarCraft.pro(位于 安装目录/Games/ 下)至今仍吸引着我。希望能转化为其他编程语言实现,研究 IDE 如何实现了 Prolog 脚本是其中一项重要内容,在此写下自己的分析进展。

Assert.cpp - 编译入口

文件内只定义了一个函数:

void assert(DWORD iii, DWORD where)

在 Linux 下编译会提示 assert 函数只需要一个参数却给了两个,这是因为与系统定义的 assert 函数冲突了,虽然 stdafx.h 中似乎取消了 assert 原来的定义:

#undef assert //???plam

重命名这个函数为 prologAssert 之类的别的名称可以避免错误,在 HeadFunc.h 中的下述声明也需要修改:

extern void assert(DWORD, DWORD);

assert 函数体内的 Program 在 Intelig.cpp 文件中声明:

DWORD *Functors, *Program, *Program2, *ProgTail, *Pointers;

在 Global.cpp 中赋值:

Program=(LPDWORD)GlobalLock(hProgram);

Intelig.cpp - 加载语法文件(.add和.def)

void compile(int flag)
{
    ...
    file.SeekToBegin();
    f_end=file.Read(string, L_BUFER);
    ...
}

string 即 IDE 读取到的 Standard.def 的文件内容。

stdafx.h - 引入MFC库

...
#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxole.h>         // MFC OLE classes
#include <afxodlgs.h>       // MFC OLE dialog classes
#include <afxdisp.h>        // MFC Automation classes
#include <afxdocob.h>
 // Here, minimal DB support is requested.  No view is chosen.

#include <afxdtctl.h>		// MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>			// MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT

#include <afxsock.h>		// MFC socket extensions
#include <afxrich.h>		// MFC rich edit classes
...

在不同版本的 Visual Studio 构建时,下面的宏可能需要修改,按照构建提示修改即可

// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER				// Allow use of features specific to Windows 95 and Windows NT 4 or later.
#define WINVER 0x0501		// Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif // This was 0x0400 for 95 and later but now is 98 and later 

#ifndef _WIN32_WINNT		// Allow use of features specific to Windows NT 4 or later.
#define _WIN32_WINNT _WIN32_WINNT_WINXP		// Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif

#ifndef _WIN32_WINDOWS		// Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif

Graphic.h - Strawberry Prolog 图形相关函数的实现

示例:

case 166:        // get_selection
Temp->GetSel((long &)i,(long &)j);
Buda1[Buda2[Arguments+1]]=Buda1[Buda2[Arguments+2]]=TT_INT;
Buda2[Buda2[Arguments+1]]=i;
Buda2[Buda2[Arguments+2]]=j;
WILL_CLEAN(Buda2[Arguments+1]);
WILL_CLEAN(Buda2[Arguments+2]);
return(1);

Strawberry.rc - 界面定义

顶部工具栏:

/
//
// Toolbar
//

IDR_MAINFRAME_BIG TOOLBAR 24, 24
BEGIN
    BUTTON      ID_FILE_NEW
    BUTTON      ID_FILE_OPEN_ST
    BUTTON      ID_FILE_SAVE
    SEPARATOR
    BUTTON      ID_EDIT_CUT
    BUTTON      ID_EDIT_COPY
    BUTTON      ID_EDIT_PASTE
    SEPARATOR
    BUTTON      ID_RUN_RUN
    BUTTON      ID_RUN_COMPILE
    BUTTON      ID_RUN_BUILD_EXE
    BUTTON      ID_TRACE_STEP
    SEPARATOR
    BUTTON      ID_TRACE_PROOFTREE
    BUTTON      ID_TOOLS_OBJBROW
    SEPARATOR
    BUTTON      ID_FILE_PRINT
    BUTTON      ID_FILE_PRINT_PREVIEW
    BUTTON      ID_APP_ABOUT
    BUTTON      ID_CONTEXT_HELP
    SEPARATOR
    BUTTON      ID_TRACE_TRACE
    BUTTON      ID_TRACE_STOP
END

菜单

/
//
// Menu
//

IDR_ProjectTYPE_CNTR_IP MENU
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "&New\tCtrl+N",                ID_FILE_NEW
        MENUITEM "&Open...\tCtrl+O",            ID_FILE_OPEN_ST
        MENUITEM "&Close",                      ID_FILE_CLOSE
        MENUITEM "&Save\tCtrl+S",               ID_FILE_SAVE
        MENUITEM "Save &As...",                 ID_FILE_SAVE_AS
        MENUITEM SEPARATOR
        MENUITEM "&Print...\tCtrl+P",           ID_FILE_PRINT
        MENUITEM "Print Pre&view",              ID_FILE_PRINT_PREVIEW
        MENUITEM "P&rint Setup...",             ID_FILE_PRINT_SETUP
        MENUITEM SEPARATOR
        MENUITEM "Sen&d...",                    ID_FILE_SEND_MAIL
        MENUITEM SEPARATOR
        MENUITEM "Recent File",                 ID_FILE_MRU_FILE1, GRAYED
        MENUITEM SEPARATOR
        MENUITEM "E&xit",                       ID_APP_EXIT
    END
    MENUITEM SEPARATOR
    MENUITEM SEPARATOR
    POPUP "&Window"
    BEGIN
        MENUITEM "&New Window",                 ID_WINDOW_NEW
        MENUITEM "&Cascade",                    ID_WINDOW_CASCADE
        MENUITEM "&Tile",                       ID_WINDOW_TILE_HORZ
        MENUITEM "&Arrange Icons",              ID_WINDOW_ARRANGE
    END
END

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读/书籍书单大全:

(点击右侧 即可打开个人博客内有干货):技术干货小栈
=====>>①【Java大牛带你入门到进阶之路】<<====
=====>>②【算法数据结构+acm大牛带你入门到进阶之路】<<===
=====>>③【数据库大牛带你入门到进阶之路】<<=====
=====>>④【Web前端大牛带你入门到进阶之路】<<====
=====>>⑤【机器学习和python大牛带你入门到进阶之路】<<====
=====>>⑥【架构师大牛带你入门到进阶之路】<<=====
=====>>⑦【C++大牛带你入门到进阶之路】<<====
=====>>⑧【ios大牛带你入门到进阶之路】<<====
=====>>⑨【Web安全大牛带你入门到进阶之路】<<=====
=====>>⑩【Linux和操作系统大牛带你入门到进阶之路】<<=====

天下没有不劳而获的果实,望各位年轻的朋友,想学技术的朋友,在决心扎入技术道路的路上披荆斩棘,把书弄懂了,再去敲代码,把原理弄懂了,再去实践,将会带给你的人生,你的工作,你的未来一个美梦。

 类似资料: