i社区用户: 密码:
搜索:
首页| 资讯| 信息化| 产品| 专题| 创业| 技术天地| 企业中心| 企业论坛| 职场| 周报全文| 商城| 市场
会展| Blog| i社区| 社区联盟| RSS| 电子杂志| 发行| 直播| IT两会| i| 下载| 上网导航| CIO俱乐部

结构的直接检测函数

陈凤国

读了贵报1993年9月29日刘卓明用C语言编写的《FoxBASE
源程序结构检测程序FOXCHEC》一文后,觉得该文应用堆栈思想实现结
构的检测确实十分巧妙,不过由于C语言中没有提供AT( )、SUBST
R ( )、LTRIM( )这三个字符串操作函数,该文自定义了这三个
函数;而实际上FoxBASE语言本身提供这些函数,因此直接用FoxB
ASE语言编写该程序将更为简洁,下面就提供一个用FoxBASE语言编
写的结构检测程序,该程序以函数的形式给出。
调用方法
.? CHEC(“源程序名”)
当每对匹配语句匹配正确也即结构正确时,函数返回.T.,否则返回错
误的行号及语句。
主要算法
也是用堆栈思想,具体可参见原文,这里不再赘述。要注意的是用数组作
堆栈时,FoxBASE语言的下标是从1,而不是从0开始,这点与C语言
不同。
另外使用本函数时,需在当前目录下建立一个单字段(字段名为S,字符
型,宽度为254)的数据库CHEC.DBF。
.TYPE CHEC.PRG
PARA FILENAME
SET TALK OFF
SET SAFE OFF
IF AT(".PRG".UPPE(F1LENAME))=0
FILENAME=FILENAME+".PRG" &&若无扩展名.补上
ENDIF
USE CHEC
ZAP
APPE FROM &F ILENAME SDF
STACK=RECC( )+1 &&堆栈大小为源程序行数加1即可
DIME BZ(STACK).HH(STACK)
STOR O TO BZ.HH
GO TOP
SP=1 &&开始时,堆栈为空
TAG=0 &&特征值赋值
DO WH1L .NOT.EOF ( )
SS=UPPE(LTRIM(TR1M(S)))
DO CASE
CASE LEFT(SS.2)="1F"
TAG=10
CASE LEFT(SS.4)="END1"
TAG=11
CASE LEFT(SS.7)="DO CASE"
TAG=20
CASE LEFT(SS.4)="ENDC"
TAG=21
CASE LEFT(SS.7)="DO WH1L"
TAG=30
CASE LEFT(SS.4)="ENDD"
TAG=31
CASE LEFT(SS.4)="TEXT"
TAG=40
CASE LEFT(SS.4)="ENDT"
TAG=41
OTHE
TAG=0
ENDCASE
IF TAG>0
IF TAG-BZ(SP)=1 &&注意FOXBASE数组下标从1开始,与C语言
SP=SP-1 &&从0开始不同
ELSE
SP=SP+1
BZ(SP)=TAG
HH(SP)=RECN( ) &&语句行号就是当前记录号
END1F
END1F
SK1P
ENDDO
1F SP=1 &&堆栈为空,说明结构正确
USE
RETU .T.
ELSE
1=2
DO WH1L 1<=SP
1F HH(1)> 0
GO HH(1)
?"ERROR LINE NUMBER:"+STR(HH(1).4)
?"ERROR SENTENCE: "+TR1M(S)
END1F
1=1+1
ENDD0
END1F
USE
PETU··

(计算机世界报 1994年 第8期)



周报全文频道联系方式:010-68130909
【关于我们】  【广告服务】  【周报发行】  【投稿指南】  【投稿声明】  【联系方式】  【法律声明】
  【媒体手册】  【编读往来】  
Copyright© ccw.com.cn,All rights reserved
中国计算机世界出版服务公司版权所有