freePascal(免费或涡轮)阅读



我试图理解在 Free Pascal 中看到的一种有点神奇的行为,在 Linux 下以 Turbo 模式(特别是fpc -Mtp -vw(编译。该代码来自 Jack Crenshaw 的"Let's Build a Compiler",第 IV 部分,特别是带有InputOutput过程的最后一个版本,可在 http://www.pp4s.co.uk/main/tu-trans-comp-jc-04.html 中找到。 我觉得"神奇"的是Input程序中的Read(Table[GetName]);行。根据 FP 文档,"Read从文件 F 中读取一个或多个值,并将结果存储在 V1、V2 等中;如果未指定文件 F,则读取标准输入。 在GetChar过程中的Read中,它的行为似乎很像 C 的getchar(),即从 stdin 缓冲区中检索下一个字符。在Input调用中,它的行为似乎就像一个复杂的scanf(),它会自动跳过空格并将多位数转换为整数,并消除了对GetNum函数的需求,如果您使用例如?i 345,它不会被调用,但如果您尝试i=345,它会被调用, 如果在=的两侧留下空格,则会导致解析错误。 是否有其他文档可以证实Free,Turbo甚至通用PascalRead的明显多功能性?

帕斯卡 读,写例程是神奇的。IOW 它不是存在于某个库中的真实函数,但编译器会在运行时中生成一系列调用。 该系列由read,readln,write和writeln组成,以及扩展的Pascal readstr和writestr,它们是读写的"来自字符串"版本。

调用根据参数的类型以及它们是否有额外的参数而有所不同(例如,对于整数,write take :x 格式化值,对于实数为 :x:y(:

writeln(x:10:5); 

在 Free Pascal 中,与Turbo Pascal 和 Delphi 相反,一些类似 RTTI 的功能也被暴露出来,例如 writeln(( 一个枚举类型的变量,会将枚举的值打印为 identifer(字符串(。

错误处理和格式化在一定程度上受到限制,因此它们的用法会随着问题的复杂性而变化

至于你的观察,你的getchar like调用可能读取了一个char类型的变量,而另一个函数的类型是不同的。

我找到了一些关于 Pascal's Read 过程的信息,这表明与 C 的getchar()不同,它会自动正确填写各种类型。但这不是你要问的有趣东西。

Jack的编译器有一个填充Look变量的GetChar()过程;这是一个单字符的展望,在解析器中相当普遍,尽管现在通常隐藏在许多层包装纸下。但是 Jack 的所有方法都被告知这个变量,这就是为什么他们首先检查它,然后在结束时再次调用GetChar(),例如:

{ Get a number }
function GetNum : integer;
begin
if not IsDigit(Look) then
Expected('Integer');
GetNum := Ord(Look) - Ord('0');
GetChar;
end;

请记住,在 Pascal 中,赋值函数名称是返回值的方式,所以他在这里做的是说"我的前瞻字符是数字吗?如果是这样,请对其进行解码并返回,然后读取新的前瞻字符,否则中止。在本章的后面,他将扩展这个定义来处理多个数字。杰克实际上在上一章中处理了空格,在那里寻找SkipWhite。

相关内容

  • 没有找到相关文章

最新更新