Simple Command Interpreter

Anything QL Software or Programming Related.
Post Reply
tcat
Super Gold Card
Posts: 633
Joined: Fri Jan 18, 2013 5:27 pm
Location: Prague, Czech Republic

Simple Command Interpreter

Post by tcat »

Hi,

In my basic programs I often rely on SuperBASIC command interpreter, very useful feature whereby procedures become commands one can easily type in. However once the program gets compiled this feature seems unavailable and needs to be somehow coded in the program.

This inspired my next exercise writing simple command interpreter, I am looking for something not perfect but simple. I was thinking at first to use `ON GOSUB', but I did not figure out how to pass parameters to procedures.

This somehow does what I need, but can it be even more simplified?
`CLI' = starts the interpreter, `.' = ends it

Code: Select all

100  DEFine PROCedure CLI
110  REMark Simple Command Interpreter
120  REMark (c)tcat
130  LOCal usr$(30),cmd_no,cmd$(10),prm1,prm1$(20),prm2,prm2$(10)
140  :
150  REPeat usr_loop
160   RESTORE 430
170   INPUT#0,"> ";usr$
180   REPeat cmd_loop
190    IF EOF THEN EXIT cmd_loop
200    READ cmd_no,cmd$: IF cmd$ INSTR usr$ THEN EXIT cmd_loop
210   END REPeat cmd_loop
220   :
230   prm1$(0)=0: prm2$(0)=0
240   prm1=' ' INSTR usr$: IF prm1>0 THEN prm1$=usr$(prm1+1 TO LEN(usr$))
250   prm2=',' INSTR prm1$
260   IF prm2>0 THEN 
270    prm2$=prm1$(prm2+1 TO LEN(prm1$)): prm1$=prm1$(1 TO prm2-1)
280   END IF 
300   :
310   SELect ON cmd_no
320    = 1: Proc1
330    = 2: Proc2 prm1$
340    = 3: Proc3 prm1$, prm2$
350    = 4: EXIT usr_loop
360    =-1: PRINT#0,"unknown command"
370   END SELect 
380  END REPeat usr_loop
390 END DEFine CLI
400 :
410 :
420 REMark Command List
430 DATA 1,"Proc1", 2,"Proc2", 3,"Proc3", 4,'.'
440 DATA -1,"END"
450 :
460 :
470 REMark Test Procedures
480 DEFine PROCedure Proc1
490  PRINT#0,"Proc1 called - no params"
500 END DEFine Proc1
510 :
520 DEFine PROCedure Proc2 (p1$)
530  PRINT#0,"Proc2 called - param1:"!;p1$
540 END DEFine Proc2
550 :
560 DEFine PROCedure Proc3 (p1$,p2$)
570  PRINT#0,"Proc3 called - param1:"!;p1$;!!;"param2:"!;p2$
580 END DEFine Proc3
590 :
600 REMark END
Tom


tcat
Super Gold Card
Posts: 633
Joined: Fri Jan 18, 2013 5:27 pm
Location: Prague, Czech Republic

Re: Simple Command Interpreter

Post by tcat »

Hi,

A revised version, possibly more robust to mistyping.
But slightly more complicated around parameter parsing, with fixed no# 2 parameters.

EDIT, EDIT, EDIT

Code: Select all

100  DEFine PROCedure CLI
110  REMark Simple Command Interpreter
120  REMark (c)tcat
130  LOCal usr$(30),cmd_no,cmd$(10),prm1,prm1$(20),prm2,prm2$(10)
140  :
150  REPeat usr_loop
160   RESTORE 490
170   INPUT#0,"> ";usr$
180   REPeat cmd_loop
190    IF EOF THEN EXIT cmd_loop
200    READ cmd_no,cmd$: IF cmd$ INSTR usr$ THEN EXIT cmd_loop
210   END REPeat cmd_loop
220   :
230   REMark Get first parameter
240   prm1$(0)=0: prm2$(0)=0
250   prm1=' ' INSTR usr$
260   IF prm1>0 THEN 
270    prm1$=usr$(prm1+1 TO )
280   END IF 
290   :
300   REMark Get second parameter
310   prm2=',' INSTR prm1$
320   IF prm2>1 THEN 
330    prm2$=prm1$(prm2+1 TO )
340    prm1$=prm1$(1 TO prm2-1)
350   END IF 
360   :
370   SELect ON cmd_no
380    = 1: Proc1
390    = 2: Proc2 prm1$
400    = 3: Proc3 prm1$, prm2$
410    = 4: EXIT usr_loop
420    =-1: PRINT#0,"unknown command"
430   END SELect 
440  END REPeat usr_loop
450 END DEFine CLI
460 :
470 :
480 REMark Command List
490 DATA 1,"Proc1", 2,"Proc2", 3,"Proc3", 4,'.'
500 DATA -1,"END"
510 :
520 :
530 REMark Test Procedures
540 DEFine PROCedure Proc1
550  PRINT#0,"Proc1 called - no params"
560 END DEFine Proc1
570 :
580 DEFine PROCedure Proc2 (p1$)
590  PRINT#0,"Proc2 called - param1:"!;p1$
600 END DEFine Proc2
610 :
620 DEFine PROCedure Proc3 (p1$,p2$)
630  PRINT#0,"Proc3 called - param1:"!;p1$;!!;"param2:"!;p2$
640 END DEFine Proc3
650 :
660 REMark END
Tom


Derek_Stewart
Font of All Knowledge
Posts: 3957
Joined: Mon Dec 20, 2010 11:40 am
Location: Sunny Runcorn, Cheshire, UK

Re: Simple Command Interpreter

Post by Derek_Stewart »

Hi Tom,

If you use Qliberator, can be made to compile S*Basic procedures and Function so they can be LRESPRed into the part of the QL Keywords, by using the External directive.

Turbo uses TASCOM or Task Commander, to compile programmes into keywords. I must admitting to only read the manual and not used TASCOM.


Regards,

Derek
Post Reply