Forth 文本解释程序
body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}
| SP@ | (- addr) | 参数堆栈指针 |
| SP! | ( n - ) | 把参数堆栈指针设置成规定的数值 |
| RP@ | (- addr) | 返回堆栈指针 |
| RP! | (n - ) | 把返回堆栈指针置为规定的数值 |
|
: QUIT FORTH 的主要循环。接收来自终端的输入并解释执行,如果成功则显示“ok”.
SP0 @ ' TIB ! 置终端输入缓存区在参数堆栈上方。
BLK OFF 令 BLK 为0,处理来自终端的输入。
[COMPILE] [ 令 STATE 为0,使系统处于解释状态。
BEGIN 进入 FORTH 主要循环。
RP0 @ RP! STATUS 初始化返回堆栈指针。送出一个回车换行。
QUERY 催促使用者从终端输入下一行并将输入行传送到 TIB 中。
RUN 处理所接收的行。
STATE @ NOT 如果 STATE 为0,系统处于执行状态。
IF ." OK" THEN 显示出信息"ok"。
AGAIN ; 无穷循环:一行处理完毕后要求得到下一行。
: RUN ( - ) 改进了的解释程序,运行分行输入一个冒号定义。 STATE @ IF 若 STATE 不为0。系统必须处于编译状态。
] 调用编译程序。
STATE @ NOT 编译完一源行后再次检查 STATE 之值。
IF INTERPRET THEN 若系统已脱离了编译状态,那么就执行该行的剩余部分,否则退出。
ELSE INTERPRET STATE 为0,执行命令
THEN ;
RUN 的过程就是: IF 编译 ELSE 执行 THEN ; |
| : INTERPRET ( - ) forth 解释程序循环:分离出输入流中的词,如果它在词典中有定义,则执行之。否则将其转换为一个数字并放置到参数栈上。 BEGIN ?STACK 检查堆栈有无上溢或下溢 DEFINED 取出输入流中的下一个词,返回它的 cfa 及一个标志 IF EXECUTE 如果该词已被定义,则执行 ELSE NUMBER 否则转换成为一个数字 DOUBLE? 它是一个双精度数吗? NOT IF DROP THEN 不是就丢弃它的高 16 位,仅保留低 16 位 THEN FALSE 在堆栈上为 DONE? 留下一个 FALSE;解释程序死循环,一直在运行 DONE? 到了行的末端了? UNTIL ; 如果已到行结束处,退出循环;否则再次循环去处理下一词。 |
| : ?STACK ( - ) 检查参数堆栈是否上溢或下溢,若溢出则控制返回终端。 SP@ 取出现行堆栈指针的值 SP0 @ 取出栈底的位置 SWAP U< 检查是否下溢 ABORT" STACK Underflow" 若下溢则执行 ABORT" SP@ PAD PAD 之值同时也是参数栈顶的上限 U< 检查是否上溢 ABORT" Stack Overflow" ; 若上溢则也执行 ABORT" |
Forth 文本解释程序的更多相关文章
- Forth 内部解释程序工作流程
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- FORTH基础
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- Forth 编译程序
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- Forth 输入流处理
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- Forth相关IO操作
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- Forth 内存布局
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- PC/FORTH 变量|常数|数组
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- PC/FORTH 循环
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- PC/FORTH 编辑程序
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
随机推荐
- 对于SQL注入的理解
从网上搜索的资料,结合自己的理解整理了一下,网友们在查看时若有发现问题,还请不吝指正,谢谢! 1.什么是SQL注入? ——官方说法:把SQL命令插入到web表单验证的输入框中,提交到服务器,以达到越过 ...
- Python使用LDAP做用户认证
LDAP(Light Directory Access Portocol)是轻量目录访问协议,基于X.500标准,支持TCP/IP. LDAP目录以树状的层次结构来存储数据.每个目录记录都有标识名(D ...
- Linux驱动
1 驱动分类 常规分类:字符设备.块设备.网络设备 字符设备:一种按字节来访问的设备,字符驱动负责驱动字符设备,这样的驱动通常实现open.close.read和write系统调用.如串口.LED.按 ...
- Unity3D制作红色射线
1.在发射射线的位置创建一个空物体用于存储发射点的位置信息. 2.制作射线,为发射射线物体添加LineRenderer组件 制作Material材质并把其类型改为Particles/Addictiv ...
- 实验一:c++简单程序设计(1)
实验结论 编程练习2-28 switch版源码: #include <iostream> using namespace std; int main(void) { cout <&l ...
- eclipse报错:Multiple annotations found at this line: - String cannot be resolved to a type解决方法实测
Multiple annotations found at this line:- String cannot be resolved to a type- The method getContext ...
- PHP算法练习1:两数之和
leetcode地址:https://leetcode-cn.com/problems/two-sum/description/ 题目: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. ...
- 《R语言入门与实践》第五章:对象改值
本章将了如何对一个数据对象中的数据进行改动,分为以下方法: 直接改值 条件取值然后改值 直接改值 单个改值:vec[1] <- 1000多个改值: vec[c(1,3,5)] <- 100 ...
- 【转】EDID的简介和解析
转自:https://www.cnblogs.com/beyond-rxl/p/9266997.html 一.EDID简介 EDID: Extended Display Identification ...
- Delphi【异常捕获以及Exe调用方法方法】
通过测试.exe程序调用dll外部方法,通过dll调用主程序.exe方法实现. Showmessage('进入方法?这里是dll里LoginElecReq'); try ShellExecute( ...