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. Spring框架的第四天(整合ssh框架)

    ## Spring框架的第四天 ## ---------- **课程回顾:Spring框架第三天** 1. AOP注解方式 * 编写切面类(包含通知和切入点) * 开启自动代理 2. JDBC模板技术 ...

  2. 分治法——快速排序(quicksort)

    先上代码 #include <iostream> using namespace std; int partition(int a[],int low, int high) { int p ...

  3. 【只要有ENA千万别用NCBI】拆分SRA文件,通过SRAtoolkits

    只要有ENA千万别用NCBI!!!! 最近开始分析网上Download的数据,一开始用人家现成的GWAS数据,后来觉得反正自己的数据到手该做的也是要做的,出来混早晚是要还的,所以就开始从头分析一些SR ...

  4. Redis初探-Redis安装

    官网地址:https://redis.io/download 最新版本是4.0,在这里本人下的是3.2 使用rz命令可以将Redis上传到Linux系统 首先要确定Linux上是否安装了gcc,没有则 ...

  5. Filter中request对象强转问题

    以下为过滤器doFIlter方法的源代码: public void doFilter(ServletRequest request, ServletResponse response, FilterC ...

  6. hisicv200 exfat支持

    由于项目中需要128Gsd卡支持.所以内核里面需要支持exfat 1.exfat 由于版权问题,所以linux kernel一直都没法支持,由于某些公司在linux kernel 3.9版本开源exf ...

  7. Linux rsync同步

    rsync介绍 rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文 ...

  8. jmeter基本使用

    下载安装,推荐官网http://jmeter.apache.org/download_jmeter.cgi 安装步骤不做赘述,可以看这篇博文https://blog.csdn.net/u0103401 ...

  9. 剑指offer(62)二叉搜索树的第K个节点

    题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4. 题目分析 首先,我们可以先画图.画完图后我们要想办法从 ...

  10. arXiv 提交 pre-print 文章的相关注意事项

    arXiv 提交 pre-print 文章的相关注意事项 2018-11-25 22:38:28 1. 有一个可以正常上传 paper 的 arXiv 账号:https://arxiv.org/  这 ...