parsing - 第四次跳过 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
'
:应该从输入流中读取一个单词,然后推送它的编译地址[']
: like'
but 从当前行读取一个单词(::
声明的内部)(LIT)
/(STRLIT)
:应该根据文档从输入流中读取文字,我只能使它们出现段错误,我认为它们仅供编译器内部使用(例如,如果编译器遇到数字文字,它会将(LIT)
单词编译为使其将该数字压入堆栈)
也没有WORD
或PARSE
在其他一些方面。
如您所见,由于'
某种奇怪的原因,实际上正在努力从输入流中获取某些内容,并且看起来[']
无法捕获;
which 然后出错,因为它突然遇到了;
它不属于的地方。
我怀疑它实际上运行了' [']
,即使它应该在输入流上工作,而不是直接行,而且我显然在那里处于编译模式。
我对有条件地声明变量做了类似的事情[COMPILE] ' DROP
,跳过一个单词(RES x
变成)很容易' x DROP
,但在这里我很确定我实际上无法编译这些指令,因为我不能发出在声明之外循环。除非有人知道如何以某种方式编译类似的代码,以递归方式摆脱所有内容,直到;
?
解决方案
一个问题是'
找不到号码。一种可能的解决方案是为定义使用特殊的虚拟名称,而不是跳过它:
: ::
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
;
但是由于非标准的单词,它可能不起作用。另一个问题是非冒号定义超出了范围。
也许,更好的解决方案是通过外部手段进行预处理。
推荐阅读
- python - 如何通过熊猫中给定的填充值更新小数点前后的字符串格式
- java - 使用准备好的语句动态更改行的更新语句
- python - 如何避免kivy图形的内存问题?
- apostrophe-cms - 有什么方法可以在撇号页面中注入浏览器 JS 吗?
- python - 创建内存高效的神经网络
- wordpress - 警告:preg_replace(): Unknown modifier 'j' in
- angular - 我应该为多个变量创建多个服务吗?
- php - 用级别映射点的最佳实践
- flutter - 我想修复 Right Text , Left Text 使用剩余空间
- android - Android Webview - iframe 内容未加载或加载不正确