3

我正在尝试在Gforth中编写解释器,但它不起作用。我得到的只是一个无限的列表 num num num ...

: ?refill
  source nip >in @ =
  if
    refill drop
  then
  ;

: inter
  begin
    ?refill
    bl word find dup
    if
      state @ =
      if
        ." comp "
        ,
      else
        ." exec "
        execute
      then
    else
      dup rot count >number
      if
        abort
      then
      drop drop state @
      if
        ." lit "
        ['] lit , ,
      else
        ." num "
      then
    then
  again
  ;

inter

: test 10 20 ;
4

1 回答 1

4

您的解释器确实可以工作,只是不会阻塞,请查看输出中的前几个单词:

num exec lit lit exec num num num ...

但是,您将 a0留在堆栈上的某个地方,这就是您创建堆栈溢出的原因,您可以~~在代码中使用它来检查堆栈并跟踪 unconsumed 0

Bernd Paysan 向 GForth 介绍了识别器,我建议你看看它们,因为它们可以减轻你编写解释器的任务。

于 2013-02-13T17:25:20.123 回答