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;}
| TIB ( - addr ) 留下输入终端缓冲区的地址。 |
| VARIABLE #TIB (- addr)这个变量留下的地址中存有当前文本输出缓冲区中的字节数,他不是缓冲区的长度,而是缓冲区中当前存在的输入流的长度 |
| VARIABLE >IN ( - addr ) 是一个指针,它指着当前要被处理的字符。其值(@)为距离输入缓冲区起始地址的位移。 |
| VARIABLE BLK ( - addr ) 其值(@)是要被解释的磁盘块号。若为 0 表示输入取自终端输入缓冲区。所以不能 LOAD 0 |
| DEFER SOURCE | 用以返回存放当前输入流的缓冲区的首地址。其 pfa 单元的内容是(SOURCE)的执行地址 | |
| (SOURCE) | ( - addr len ) | 返回文本解释程序行将处理的字符串。addr 和 len 分别是输入缓冲区的起始地址及长度 |
| LABEL DONE | 当输入流耗尽时的公共返回点 | |
| SKIP | ( addr len char - addr1 len1 ) | 根据一字符串的地址,长度和一个指定的字符从头开始扫描该字符串直到在字符串中发现一个与指定字符不相符的字符时停止。在参数堆栈上留下第一个不相符的地址及剩余字符串的长度 |
| SCAN | ( addr len char - addr1 len1 ) | 到一指定字符串中寻找指定的字符直到找到为止。在参数堆栈上留下相符字符的地址及字符串的剩余长度 |
| /STRING | ( addr len n - addr1 len1 ) | 丢弃指定字符串最左边的 n 个字符,addr1=addr+n;len1=len-n |
| MOVE | ( from to len - ) | 把从地址from开始的一定量16位字移动到to开始的区域,不会有重叠发生。CMOVE什么的会有重叠 |
| P | ( char - addr len ) | 忽略掉领头的字符 char , 接着扫描输入流直到下一次在遇到指定的字符 char 。更新指针 >IN 的内容。在参数堆栈上留下分离出来的词的地址和长度 |
| PARSE | ( char - addr len ) | 同上,只是不忽略领头的字符 char |
| WORD | ( char - addr ) | 以 char 作为终止字符分解输入流。把分离出来的词放在由 HERE 处开始的词缓冲区中,第一个字节内存放词的长度,接着是组成该词的字符,最后一定跟有一个空格,该空格不计入词的长度。在参数堆栈上留下存放长度字节的地址 |
| : ( forth的注释命令,它与)配对使用。文本解释程序对于位于圆括号内的内容不予理睬 ASCII ) 使用)作为终止符,在参数堆栈上留下)的 ascii 代码 PARSE 把 >IN 推至)后的那个字符 2DROP 丢弃注释的地址和长度,因为不对注释做任何处理。 ; IMMEDIATE 使(成为立即词,这样在冒号定义内便执行而不是编译 |
| : .( ASCII ) PARSE |
| EXPECT | ( addr n - ) | 把n个字符从终端传送到主存中自地址 addr 开始的区域中。EXPECT 循环调用KEY,每读入一个键就把所键入的字符送到自 addr 开始的缓冲区中一次存放,一直到读进第n个或遇到回车键。所读入的字符个数存放在SPAN中,回车键不计入总数。EXPECT 允许键入的时候修改 |
| QUERY | ( - ) | 从操作者终端输入80个字符文本。文本放置在地址TIB。把>IN和BLK置零,#TIB 等于接收的字符数。为系统解释接收进来的源行做好准备。 |
| SPAN | ( - addr ) | 留下通过最后执行 EXPECT 实际收到和存储的字符计数变量的地址。 |
| CREATE BUFF1 DECIMAL 80 ALLOT 建立一个 80 字节的名叫 BUFF1 的缓冲区。 |
| VARIABLE SPAN1 用来保存下面输入字符的个数 |
|
: READLINE 把一行字符从终端传送到 BUFF1
CR BUFF1
80 ( addr size - )
EXPECT
CR ." SPAN= " SPAN @
DUP . SPAN1 ! ;
|
: QUERY ( - ) TIB 80 EXPECT 从终端输入80个字符到TIB SPAN @ 获取实际的长度 #TIB ! 把实际长度存入 #TIB 中,这样解释程序将会知道输入流何时耗尽 BLK OFF 清零 BLK,这样文本解释程序将使用终端输入缓冲区 >IN OFF ; 清零字符指针,于是扫描将从 TIB 的起点开始 |
| : COUNT ( addr - addr+1 len ) DUP 1+ SWAP C@ ; 转换计数字节地址为 地址-长度 表示 |
: TYPE ( addr len - ) 在终端上显示出指定的字符串。其中 addr 是要显示的首字符地址,len 是要显示的字符个数。 0 ?DO DUP C@ EMIT 1+ 递增字符地址 LOOP DROP ; 清除堆栈上的无用地址 |
| : -TRAILING ( addr len - addr len1 ) 用改变长度的方法删去一字符串的结尾空格 DUP 0 ?DO 2DUP + 1- 把最后一个字符的地址送到参数堆栈顶 C@ BL <> 判断是不是空格 IF LEAVE THEN 如果不是就结束循环 1- 是,字符串长度减一 LOOP ; |
|
Forth 输入流处理的更多相关文章
- 输入流和字符串互转,InputStream2String,String2InputStream
输入流转字符串 public static String InputStream2String(InputStream in) { InputStreamReader reader = null; t ...
- 在.NET中使用管道将输出流转换为输入流
最近在写一段代码,将本地文件压缩加密后发送到服务器,发送到服务器的类用一个输入流作为参数获取要上传的数据,而压缩类和加密类都是输出流. 如何将输出流转换为输入流,最直观的方法是缓存输出流的全部内容到内 ...
- 详解PHP输入流php://input
在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组.所以,这里主要探讨php输入流php://input 对一php://inpu ...
- java读取输入流
java读取输入流两种 private static byte[] readStream(InputStream in){ if(in==null){ return null; } byte[] bu ...
- PHP 输入流 php://input
在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组.所以,这里主要探讨php输入流php://input 对一php://in ...
- Struts2文件下载找不到输入流异常
先发异常 Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack. Check ...
- 字符输入流Reader简要概括
字符输入流Reader组成结构 本篇将对JAVA I/O流中的字符输入流Reader做个简单的概括: 总得来说,每个字符输入流类都有一个对应的用途,如下: 字符流基类:Reader 字节流转字符流:I ...
- [转]java 输出流转输入流
ByteArrayOutputStream.toByteArray ByteArrayInputStream StringWriter.toString StringReader 字符流和二进制流是j ...
- java io系列14之 DataInputStream(数据输入流)的认知、源码和示例
本章介绍DataInputStream.我们先对DataInputStream有个大致认识,然后再深入学习它的源码,最后通过示例加深对它的了解. 转载请注明出处:http://www.cnblogs. ...
- 文件输入流 FileInputStream类 文件输出流FileOutputStream ---转载
转载自---http://blog.csdn.net/hguisu/article/details/7418161 111:文件输入流: FileInputStream可以使用read()方法一次读入 ...
随机推荐
- Oracle 25用户的权限管理
理解什么是权限 权限指的是执行特定命令或访问数据库对象的权利. 理解权限的作用 (保证)数据库安全性:系统安全性,数据安全性 了解权限的分类 系统权限: 允许用户执行特定的数据库操作,如创建表.创建索 ...
- 蓝桥杯近三年初赛题之一(15年b组)
临近比赛,自己定时做了近三年的初赛题,不是很理想,10道题平均做对5+道.为了这次比赛,总共做了200题左右吧,估计去北京参加决赛有点难,不过不管怎样,对得起自己万余行代码就好. 一.15年初赛题(第 ...
- re正则匹配
import re #'(?P<name>...)' 分组匹配print(re.search("(?P<id>[0-9]+)","abc12345 ...
- 解决mysql中文乱码问题?
mysql是我们项目中非常常用的数据型数据库.但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况.下面就来介绍一下如何彻底解决数据库中文乱码情况. 1.中文乱码 1.1.中文乱码 cre ...
- 进程间通信之信号量、消息队列、共享内存(system v的shm和mmap)+信号signal
进程间通信方式有:System v unix提供3种进程间通信IPC:信号量.消息队列.共享内存.此外,传统方法:信号.管道.socket套接字. [注意上述6种方式只能用户层进程间通信.内核内部有类 ...
- 9个顶级开发IoT项目的开源物联网平台
https://blog.csdn.net/shnbiot/article/details/80432017 物联网(IoT)是帮助人工智能(AI)以更好的方式控制和理解事物的未来技术. 我们收集了一 ...
- js 二维数组 for 循环重新赋值
javascript 二维数组的重新 组装 var arr = [[1,2],[3,4],[5,6],[7,8]]; var temp = new Array(); for(var i= 0 ;i&l ...
- linux命令之pssh命令
查看一下pssh命令的帮助文档: [root@test2 ~]# pssh --version [root@test2 ~]# pssh --help Usage: pssh [OPTIONS] co ...
- 剑指offer(21)栈的压入、弹出序列
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...
- 在 jupyter 中添加菜单和自动完成功能
在 jupyter 中添加菜单和自动完成功能 参考文档http://www.360doc.com/content/17/1103/14/1489589_700569828.shtmlhttp://to ...