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. laravel框架基础(1)---入门与介绍

    1.安装laravel5.7 (composer )2018-12-28 11:59:02 [作者:struggler] Php的版本要求:php>=7.1.3  打开php OpenSSL扩展 ...

  2. Java UTC时间与本地时间互相转换

    协调世界时,又称世界统一时间.世界标准时间.国际协调时间.由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC. 这套时间系统被应用于许多互联网和万维网的标准中,例如,网络时间协议就是协 ...

  3. eclipse添加mybatis插件

    1,在 eclipse中选择 Help->eclipse marketplace 2, 搜索安装

  4. linux tail命令及其它日志查看命令的用法

    当日志文件存储日志很大时,我们就不能用vi直接进去查看日志,需要Linux的命令去完成我们的查看任务. Log位置: /var/log/message 系统启动后的信息和错误日志,是Red Hat L ...

  5. mybatis中的foreach方法

    select  t.service_id, t.prod_id, t.prod_name, t.prod_type, t.buss_type, t.pricing_fee, t.detail from ...

  6. kernel: INFO: task sadc:14833 blocked for more than 120 seconds.

    早上一到,发现oracle连不上. 到主机上,发现只有oracleora11g一个进程,其他进程全没了. Nov 14 23:33:30 hs-test-10-20-30-15 kernel: INF ...

  7. layer(jQuery弹出层插件)

    弹窗alert:默认确定按钮+右上角关闭 top.layer.alert("请选择要删除的记录!",{shade: 0.3,offset:'250px'}); 弹窗alert:默认 ...

  8. (转载)Unity_3DText穿透场景物体解决

    在unity的3D物体下有一个3DText 物体.这个物体可以在空间坐标中显示文本文字. 如下图: 这个3D Text在场景中的显示会出现穿透3D物体的现象.如图:本来这个hello world 的文 ...

  9. 基于 arduino 的低功耗无线传感结点设计

    发送端 仿真图: *仿真图中使用使用TMP传感器(LM34)代替实际使用的DHT11传感器. 连接方式: DHT11的正极(VCC)与5V电源接口连接 DHT11的负极(GND)与GND连接 DHT1 ...

  10. Go 接口(interface)

        文章转载地址:https://www.flysnow.org/2017/04/03/go-in-action-go-interface.html 1.什么是 interface? 简单的说,i ...