* Program : PARSER * Date : 10 Sep 2004 * Author : Adrian Overs * Function : A recursive subroutine that will return RESULT * : RESULT<1> = A list of commands passed in from command line * : RESULT<2> = A list of keyword numbers and other tokens that * : correspond with the commands in attribute one. * : SENTANCE = The command line that is passed in * : RECUR = A simple counter to stop infinate recursion. ************************************************************************ * SUBROUTINE PARSER (RESULT,SENTANCE,RECUR) $OPTIONS INFORMATION $INCLUDE INSERTS PARSER.COM EQU TRUE TO 1, FALSE TO 0, OTHERWISE TO 1, BELL TO CHAR(7) RECUR += 1 IF RECUR GT 9 THEN CRT BELL: "Recursion levels nested too deep on ":SENTANCE :BELL STOP END SENTANCE = TRIMF(TRIMB(SENTANCE)) TEST = CONVERT(' ',@VM,SENTANCE) RESULT = '' ITEM = 0 LOOP REMOVE WORD FROM TEST SETTING MORE ITEM += 1 READ R.VOC FROM VOC.FV,UPCASE(WORD) ELSE R.VOC = '' BEGIN CASE CASE WORD[1,1] MATCHES '"':@VM:"'":@VM:"\" * Handle Litteral strings. POS1 = GETREM(TEST) - LEN(WORD) + 1 LEN = INDEX(TEST[POS1,99999],WORD[1,1],1) - 1 IF LEN LT 0 THEN LEN = LEN(TEST) MORE = FALSE END STRING = CONVERT(@VM,' ',TEST[POS1,LEN]) RESULT<1,ITEM> = STRING RESULT<2,ITEM> = 'G' NEXT.BYTE = (POS1 + LEN + 1) IF NEXT.BYTE GE LEN(TEST) THEN MORE = FALSE END ELSE SETREM NEXT.BYTE ON TEST END CASE R.VOC<1>[1,1] EQ 'K' * Return Keyword Number RESULT<1,ITEM> = WORD RESULT<2,ITEM> = R.VOC<2> CASE R.VOC<1>[1,1] EQ 'S' * Special case for sentences SUB.RESULT = '' CALL @PARSER(SUB.RESULT,R.VOC<2>,RECUR) RESULT<1,-1> = SUB.RESULT<1> RESULT<2,-1> = SUB.RESULT<2> ITEM = DCOUNT(RESULT<1>,@VM) CASE R.VOC<1>[1,2] EQ 'PH' * Special case for PHrases SUB.RESULT = '' CALL @PARSER(SUB.RESULT,R.VOC<2>,RECUR) RESULT<1,-1> = SUB.RESULT<1> RESULT<2,-1> = SUB.RESULT<2> ITEM = DCOUNT(RESULT<1>,@VM) CASE NUM(WORD) RESULT<1,ITEM> = WORD RESULT<2,ITEM> = "N" CASE OTHERWISE * Default Case RESULT<1,ITEM> = WORD RESULT<2,ITEM> = (IF R.VOC EQ '' THEN 'U' ELSE IF R.VOC<1>[1,1] EQ 'P' THEN R.VOC<1>[1,2] ELSE R.VOC<1>[1,1]) END CASE WHILE MORE REPEAT @USER.RETURN.CODE = DCOUNT(RESULT<1>,@VM) RETURN ; * Exit Program END