stack - 嵌套过程的 PostScript 执行

标签 stack interpreter execution procedure postscript

(我带着另一个问题回来了:-))

给出以下 PostScript 代码:

/riverside { 5 pop } def
/star { 6 pop 2 {riverside} repeat } def
star

我想知道应该如何处理嵌套过程。 (我正在创建自己的解释器)。 当我执行 star 过程时,它会在中途找到一个 nameObjec(riverside) 并将其替换为包含 Riverside 过程中的值的可执行数组并执行它们。 如果我执行重复运算符,解释器就会崩溃,因为堆栈上只剩下一项了。

当我已经在可执行数组(=prodecure)中时,我是否应该直接执行可执行数组(=procedure),或者应该始终将可执行数组(=procedures)推送到(操作数?/执行?)堆?或者只能由另一个运算符(operator)执行? 这江边该被处决多少次? (2 或 3 次?)我猜是 2 次?

供您引用:这是我在第三行执行star时遇到的情况(请参阅错误):

% begin execute 3rd line (star)
% OP = operand stack
% EX = execution stack    

% handle 6
OP: 6
EX: star

% handle pop (removes 6 from OP)
OP: -
EX: star

% handle 2
OP: 2
EX: star

% set the riverside executable array on the EX, execute the values
OP: 2
EX: star riverside

% repeat operator:
CRASH, only one item on the OP left, but repeat operator requires 2 operands.
OP: 5
EX: 

% end

请阐明这个问题,因为它有点复杂/令人困惑:-)

更新: 另一个代码示例可能是这个:

/starside
{ 72 0 lineto
currentpoint translate
-144 rotate } def

/star
{ moveto
currentpoint translate
4 {starside} repeat
closepath
gsave
.5 setgray fill
grestore
stroke } def

200 200 star

showpage

当解释器标记 /star { moveto ... 时,如果遇到嵌套的 {starside} 将如何处理? (+如果有 {starside 5 2 mul pop} 而不是只有 {starside} 会怎么样?)

最佳答案

我相信您需要查看 PLRM 第 3.5.3 节。尽管这涉及一个简单的可执行数组,但概念是相同的。当 token 扫描器遇到“{”时,它开始构建可执行数组。在到达匹配的“}”标记之前,扫描器只是将遇到的内容存储在操作数堆栈上。当遇到匹配的“{”时,对象将转换为可执行数组(并存储在操作数堆栈上)

如果扫描器遇到可执行文件名称,它将名称存储在操作数堆栈上。它不执行该名称,甚至也不对其执行查找以检索关联的对象。

因此,在示例中执行“}”之前,操作数堆栈将包含 twp 对象、“{”开头数组和可执行文件名称 Riverside。当遇到“}”时,扫描器会创建实际的可执行数组并将其存储在操作数堆栈上。 (注意,此处的实现细节有所不同)

因此,在执行“repeat”之前,堆栈上将有两个对象:计数器和包含单个可执行文件名称的可执行数组。

在执行包含该名称的可执行数组之前,您不会查找该名称。

这可能会更清楚:

%!
/test {(This is my initial string\n) print} def
2 {test} repeat
2 {test} /test {(This is my second string\n) print} def repeat

请注意,在创建包含可执行名称“test”的可执行数组之后,我重新定义了“test”,但执行过程使用了稍后的 test 定义。正如您所看到的,不要过早进行名称查找非常重要!

关于stack - 嵌套过程的 PostScript 执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16438165/

相关文章:

java - 打印堆栈内容的递归方法

c++ - 一堆函数指针 : how to call the function?

python - 纯python实现的编程语言

java - 如何为一种小语言构建解释器?

compiler-construction - 解释器/编译器如何工作

testing - 在 Flutter 中测试期间如何找到堆栈的顺序?

c# - MichaelJordan 在 .NET 堆栈上创建了多少个 ValueType 实例?

php/mysqli 查询没有执行一些没有错误的查询

windows - 线程如何在 Windows 上的多个处理器上执行?

process - 如何暂停,恢复和停止Sikuli程序?