|
||||
结构的直接检测函数陈凤国 |
|
读了贵报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 | ||||||
| 中国计算机世界出版服务公司版权所有 | ||||||