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(终端输入缓冲区) 中或 磁盘缓冲区中。
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什么的会有重叠
  // FORTH 中同一行每相邻的两个词之间的空格数目是任意的,SKIP 的目的就是忽略掉一个词前面的所有空格。SCAN 是扫描发现第一个相符字符后就停止。
P      ( char - addr len ) 忽略掉领头的字符 char , 接着扫描输入流直到下一次在遇到指定的字符 char 。更新指针 >IN 的内容。在参数堆栈上留下分离出来的词的地址和长度
PARSE ( char - addr len ) 同上,只是不忽略领头的字符 char
WORD ( char - addr ) 以 char 作为终止字符分解输入流。把分离出来的词放在由 HERE 处开始的词缓冲区中,第一个字节内存放词的长度,接着是组成该词的字符,最后一定跟有一个空格,该空格不计入词的长度。在参数堆栈上留下存放长度字节的地址
//使用定义 PARSE 的例子
:   (        forth的注释命令,它与)配对使用。文本解释程序对于位于圆括号内的内容不予理睬
        ASCII  )          使用)作为终止符,在参数堆栈上留下)的 ascii 代码
        PARSE           把 >IN 推至)后的那个字符
        2DROP         丢弃注释的地址和长度,因为不对注释做任何处理。
        ;     IMMEDIATE      使(成为立即词,这样在冒号定义内便执行而不是编译 
:   .(              
       ASCII  )
       PARSE                  TYPE  ;  IMMEDIATE            

KEY?   ( - f )   如果已按过一个按键,返回真标志。
KEY    ( - char )  读入一个 ASCII 键。
EXPECT ( addr n -  ) 把n个字符从终端传送到主存中自地址 addr 开始的区域中。EXPECT 循环调用KEY,每读入一个键就把所键入的字符送到自 addr 开始的缓冲区中一次存放,一直到读进第n个或遇到回车键。所读入的字符个数存放在SPAN中,回车键不计入总数。EXPECT 允许键入的时候修改
QUERY ( - ) 从操作者终端输入80个字符文本。文本放置在地址TIB。把>IN和BLK置零,#TIB 等于接收的字符数。为系统解释接收进来的源行做好准备。
SPAN ( - addr ) 留下通过最后执行 EXPECT 实际收到和存储的字符计数变量的地址。
eg:
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 输入流处理的更多相关文章

  1. 输入流和字符串互转,InputStream2String,String2InputStream

    输入流转字符串 public static String InputStream2String(InputStream in) { InputStreamReader reader = null; t ...

  2. 在.NET中使用管道将输出流转换为输入流

    最近在写一段代码,将本地文件压缩加密后发送到服务器,发送到服务器的类用一个输入流作为参数获取要上传的数据,而压缩类和加密类都是输出流. 如何将输出流转换为输入流,最直观的方法是缓存输出流的全部内容到内 ...

  3. 详解PHP输入流php://input

    在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组.所以,这里主要探讨php输入流php://input 对一php://inpu ...

  4. java读取输入流

    java读取输入流两种 private static byte[] readStream(InputStream in){ if(in==null){ return null; } byte[] bu ...

  5. PHP 输入流 php://input

    在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组.所以,这里主要探讨php输入流php://input   对一php://in ...

  6. Struts2文件下载找不到输入流异常

    先发异常 Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack. Check ...

  7. 字符输入流Reader简要概括

    字符输入流Reader组成结构 本篇将对JAVA I/O流中的字符输入流Reader做个简单的概括: 总得来说,每个字符输入流类都有一个对应的用途,如下: 字符流基类:Reader 字节流转字符流:I ...

  8. [转]java 输出流转输入流

    ByteArrayOutputStream.toByteArray ByteArrayInputStream StringWriter.toString StringReader 字符流和二进制流是j ...

  9. java io系列14之 DataInputStream(数据输入流)的认知、源码和示例

    本章介绍DataInputStream.我们先对DataInputStream有个大致认识,然后再深入学习它的源码,最后通过示例加深对它的了解. 转载请注明出处:http://www.cnblogs. ...

  10. 文件输入流 FileInputStream类 文件输出流FileOutputStream ---转载

    转载自---http://blog.csdn.net/hguisu/article/details/7418161 111:文件输入流: FileInputStream可以使用read()方法一次读入 ...

随机推荐

  1. C#设计模式(12)——享元模式(Flyweight Pattern)(转)

    一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非 ...

  2. Go 初体验 - channel.2 - 超时机制

    channel 虽然很好用,但是我们也要考虑异常情况,比如:超时 go 语言怎么解决这个超时问题呢? 可以利用 select 语句: select 的用法与 switch 语言非常类似,由 selec ...

  3. 2019/4/2 wen 多态、抽象

  4. Python imprt动态模块

    1.解释器内部用的动态导入 directory_variable = __improt__("directory.filename") print(directory_variab ...

  5. [c/c++] programming之路(17)、高级指针

    一.二级指针 二级指针的作用:1.函数改变外部变量指针2.外挂改变一个指针的值 #include<stdio.h> #include<stdlib.h> void main() ...

  6. 剑指offer(17)树的子结构

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目分析 分析如何判断树B是不是树A的子结构,只需要两步.很容易看出来这是一个递归的过程.一般在树 ...

  7. MySQL基础和JDBC

    第一章 命令行工具 mysqladmin:MySQL服务器管理工具 mysql:MySQL客服端链接工具 mysqldump 演示链接到服务器host=127.0.0.1,用户名为root,密码为空 ...

  8. css的再深入9(更新中···)

    一 单位 1.px 就是一个基本的单位 像素 2.em 也是一个单位 用父级元素的字体大小乘以em前面的数字.如果父级没有就继承上一个父级直到body,如果body没有那就默认是16px. 3.rem ...

  9. 没有显示器、网线、路由器,编辑TF卡连接树莓派

    只有电脑,连接树莓派的方法 电脑新建热点 打开TF卡,在根目录新建文件wpa_supplicant.conf,内容如下 country=GB ctrl_interface=DIR=/var/run/w ...

  10. Pandas 基础(7) - Group By 分组的相关知识

    首先, 引入这节需要的 csv 文件 (已上传) import pandas as pd city_df = pd.read_csv('/Users/rachel/Sites/pandas/py/pa ...