如何从源代码编译picoProlog?

时间:2015-04-27 22:59:35

标签: c prolog pascal

我是计算机科学专业的学生,​​我正在学习Prolog的逻辑编程。

我找到了一个有趣的Prolog翻译, picoProlog http://spivey.oriel.ox.ac.uk/corner/Logic_Programming)。

要了解有关Prolog的更多信息,我正在尝试编译他们的源代码,但我失败了。

在这个网页上,他们说:

  

解释器源是用Pascal的最小方言编写的,避免了许多功能,包括指针,但使用宏来克服Pascal的一些局限性,其风格受到Kernighan和Plauger的书中Pascal软件工具的启发。它带有一个从Pascal方言到C语言的翻译器,可用于构建解释器,也可用于所需的宏处理器。

     

要在Linux机器上构建解释器,只需解压缩tar文件并输入make。该建筑分几个阶段进行:

     
      
  1. 首先,Pascal-to-C转换器ptc是从C源构建的,包括用lex和yacc编写的词法分析器和解析器。文件README提供了该翻译器接受的非常有限的Pascal子集的一些细节。
  2.   
  3. 接下来,ptc用于构建宏处理器ppp。
  4.   
  5. 最后,picoProlog解释器是根据文件pprolog.x中的源代码构建的,首先使用ppp扩展宏以获取文件pprolog.p,然后使用ptc转换为C,最后编译C代码。
  6.         

    文本和软件版权©J。M. Spivey,1996,2002,2010。

他们说仅在Linux上编译,所以我不知道如何在Windows机器上编译这个源代码。我可以在 Windows XP 上使用 Turbo Pascal 7.0 (无任何要求)进行编译吗?你能删除 Pascal编译的部分脚本吗?

3 个答案:

答案 0 :(得分:3)

为了避免花更多的时间来运行P2C / PTC引导,而你可能只对解释器而不是它的* nix引导感兴趣,我认为更容易忘记PTC的东西,并专注于获取pascal部分编译/使用FPC 2.6.x. (下面花了10分钟),生成一个独立的Windows EXE,添加了10到20行代码。

从ppp开始,嗯,编译(nand works!)开箱即用:

D:\dls\prlg\pprolog>fpc ppp.p
Free Pascal Compiler version 2.6.2 [2013/02/12] for i386
Copyright (c) 1993-2012 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling ppp.p
Linking ppp.exe
394 lines compiled, 0.1 sec , 30352 bytes code, 1692 bytes data

代码确实看起来意味着输入管道。我们通过它(ppp)运行pprolog.x并且它(pprolog.pp)几乎编译。有四个问题,但通过在顶部添加一些代码而不更改原始代码(在源代码中标记为MVDV:)来解决所有问题

  1. 一些范围检查错误,因为整数类型对于设置的1MB堆栈空间来说太小。这禁止使用Turbo Pascal,但我们可以通过将integer定义为longint来解决它。
  2. 似乎它假设前向函数在FPC中不需要重复它们的参数,它们通常会修复。
  3. 在(“初始化”)的最后一个函数中,使用了一些非标准的ptc库函数,这些函数借用C(argv,argc)而不是它们的典型pascal等价物。固定的。
  4. (测试后由原作者报告)ParseFactor有一个右手递归,由读取代替    结果。启用TP模式(使用行上方为{$ mode tp}),或添加()以消除歧义
  5. 之后,pprolog.pp用FPC编译:

    Free Pascal Compiler version 2.6.2 [2013/02/12] for i386
    Copyright (c) 1993-2012 by Florian Klaempfl and others
    Target OS: Win32 for i386
    Compiling pprolog.pp
    pprolog.pp(487,19) Warning: unreachable code
    pprolog.pp(532,19) Note: Local variable "dummy" is assigned but never used
    Linking pprolog.exe
    2150 lines compiled, 0.1 sec , 84400 bytes code, 13932 bytes data
    1 warning(s) issued
    1 note(s) issued
    

    一些注意事项:

    1. UNTESTED
    2. 我不知道我是否完全正确地使用了argv / argc的范围。 (0..argc-1,而paramcount是从1开始等)检查是否有必要。
    3. 字符串系统早于TP String类型并且是复杂的(可能是因为PTC,请参阅README),我不知道它是否可行。
    4. 我已将生成的编译源代码放在http://www.stack.nl/~marcov/files/pprolog.pp

      祝你好运!

答案 1 :(得分:3)

我在谷歌搜索时发现了这个问题,虽然它已经老了,但我认为从程序作者那里添加一个明确的答案会很有帮助。

使用Free Pascal编译器编译picoProlog确实不是很难。我已经将Marco的建议纳入了源代码,修复了一个被揭示的小错误,并为Free Pascal的一个奇怪功能添加了一个解决方法。结果可以在BitBucket页面上找到:

http://bitbucket.org/Spivey/pprolog

有关在README中构建的说明。

注意:我在x86_64的Linux下使用Free Pascal构建了这个,但是还没有在Windows上测试它。我无法理解为什么它无法运作。

答案 2 :(得分:2)

考虑到Pascal存在多少种不同的变体,我的直觉是,掌握Linux环境比调整Pascal源代码以适应您的编译器更容易。这只是第一步。

获得Linux环境?试试虚拟框 - https://www.virtualbox.org