首页 > 解决方案 > 第四次跳过 ATLAST 中的输入流

问题描述

我正在尝试在ATLAST中实现一种“条件:” ,原因是我有一个文件可以多次编辑以处理我的程序流程的多个步骤(我实际上是在滥用第四个作为汇编程序,步骤 1 确实第一次解析引用等,在步骤 2 中指令字实际发出字节)。FLOAD

因此,当在该文件中为“宏”声明单词时,它在步骤 2 中出错,因为它们已经在步骤 1 中声明,但我也不能只FORGET使用它们,因为那样会忘记之后发生的所有内容,例如我刚才的引用在步骤 1 中收集

所以基本上我需要一个“:只在步骤 1 中运行”,我的想法是这样的:

VARIABLE STAGE

: ::
  STAGE @ 0 = IF
    [COMPILE] : ( be a word declaration )
  EXIT
  THEN
  BEGIN    ( eat the disabled declaration )
    '      ( get the address of the next word )
    ['] ;  ( get the address of semicolon )
    =      ( loop until they are equal )
  UNTIL
; IMMEDIATE

:: FIVE 5 ; ( declares as expected )

FIVE .      ( prints 5 )

1 STAGE !   ( up to here everything's fine )

:: FIVE 6 ; ( is supposed to do nothing, but errors out )

FIVE .      ( is supposed to print 5 again )

跟踪的错误消息(从 开始1 STAGE !):

Trace: ! 
Trace: :: 
Trace: STAGE 
Trace: @ 
Trace: (LIT) 0 
Trace: = 
Trace: ?BRANCH 
Trace: ' 
Trace: (LIT) 94721509587192 
Trace: = 
Trace: ?BRANCH 
Trace: ' 
Word not specified when expected.

Trace: ; 
Compiler word outside definition.
Walkback:
   ;

KEY ( -- ch )在 ATLAST中不存在从输入流中读取单个字符(在声明之外::,因为它是)在其他一些方面很常见,我能找到的唯一相关词是:IMMEDIATE

也没有WORDPARSE在其他一些方面。

如您所见,由于'某种奇怪的原因,实际上正在努力从输入流中获取某些内容,并且看起来[']无法捕获;which 然后出错,因为它突然遇到了;它不属于的地方。

我怀疑它实际上运行了' ['],即使它应该在输入流上工作,而不是直接行,而且我显然在那里处于编译模式。

我对有条件地声明变量做了类似的事情[COMPILE] ' DROP,跳过一个单词(RES x变成)很容易' x DROP,但在这里我很确定我实际上无法编译这些指令,因为我不能发出在声明之外循环。除非有人知道如何以某种方式编译类似的代码,以递归方式摆脱所有内容,直到;?

标签: parsinginputforth

解决方案


一个问题是'找不到号码。一种可能的解决方案是为定义使用特殊的虚拟名称,而不是跳过它:

: :: 
  STAGE @ 0 = IF : EXIT THEN
  ' DROP \ this xt isn't needed
  " : _dummy" EVALUATE ( -- n ) DROP
;

或者也许每次都使用一个新名称:

: :: 
  STAGE @ 0 = IF : EXIT THEN
  ' >NAME @ \ ( s1 ) \ should be checked
  ": _dummy_" DUP >R S+
  R> EVALUATE ( -- n ) DROP
;

但是由于非标准的单词,它可能不起作用。另一个问题是非冒号定义超出了范围。

也许,更好的解决方案是通过外部手段进行预处理。


推荐阅读