source: FOIAVistA/tag/r/CLINICAL_REMINDERS-PXRM/PXRMSTAC.m@ 636

Last change on this file since 636 was 628, checked in by George Lilly, 14 years ago

initial load of FOIAVistA 6/30/08 version

File size: 2.5 KB
Line 
1PXRMSTAC ; SLC/PKR - Stack routines for use by PXRM. ;11/24/2004
2 ;;2.0;CLINICAL REMINDERS;;Feb 04, 2005
3 ;
4 ;=====================================================
5POP(STACK) ;Pop an element off of the stack.
6 I STACK(0)=0 Q ""
7 N IND,TEMP
8 S TEMP=STACK(1)
9 F IND=2:1:STACK(0) S STACK(IND-1)=STACK(IND)
10 K STACK(STACK(0))
11 S STACK(0)=STACK(0)-1
12 Q TEMP
13 ;
14 ;=====================================================
15POSTFIX(EXPR,OPER,PFSTACK) ;Given an expression, EXPR, in infix notation
16 ;convert it to postfix and return the result in PFSTACK. PFSTACK(0)
17 ;will contain the number of elements in PFSTACK. OPER is a
18 ;string containing allowable operators.
19 N CHAR,IND,LEN,OPERP,PFP,SP,SPACE,STACK,SYM,SYMP,SYMT,TAB,TEMP
20 S SPACE=$C(32)
21 S TAB=$C(9)
22 S TEMP=""
23 S OPERP=OPER_"()"
24 S SYMP=0
25 S LEN=$L(EXPR)
26 ;Break the expression into (, ), operators, and operands.
27 ;Remove spaces and tabs and put the symbols onto the symbol
28 ;stack in left to right order. Symbol number 1 is SYM(1).
29 F IND=1:1:LEN D
30 . S CHAR=$E(EXPR,IND)
31 . I (CHAR=SPACE)!(CHAR=TAB) Q
32 . I OPERP[CHAR D
33 .. I $L(TEMP)>0 D
34 ... S SYMP=SYMP+1
35 ... S SYM(SYMP)=TEMP
36 ... S TEMP=""
37 .. S SYMP=SYMP+1
38 .. S SYM(SYMP)=CHAR
39 . E S TEMP=TEMP_CHAR
40 . I (IND=LEN)&(TEMP'="") D
41 .. S SYMP=SYMP+1
42 .. S SYM(SYMP)=TEMP
43 ;Process the symbols.
44 S (PFP,SP)=0
45 S LEN=SYMP
46 F SYMP=1:1:LEN D
47 . S SYMT=SYM(SYMP)
48 .;
49 .;Symbol is "("
50 . I SYMT="(" D Q
51 .. S SP=SP+1
52 .. S STACK(SP)=SYMT
53 .;
54 .;Symbol is an operator
55 . I OPER[SYMT D Q
56 .. S LEN=SP
57 .. F IND=LEN:-1:1 S TEMP=STACK(IND) Q:TEMP="(" D
58 ...;M has no operator precedence so we don't need to check.
59 ... S PFP=PFP+1
60 ... S PFSTACK(PFP)=TEMP
61 ... K STACK(SP)
62 ... S SP=SP-1
63 .. S SP=SP+1
64 .. S STACK(SP)=SYMT
65 .;
66 .;Symbol is ")"
67 . I SYMT=")" D Q
68 .. S LEN=SP
69 .. F IND=LEN:-1:1 S TEMP=STACK(IND) Q:TEMP="(" D
70 ... S PFP=PFP+1
71 ... S PFSTACK(PFP)=TEMP
72 ... K STACK(SP)
73 ... S SP=SP-1
74 ..;Pop the "(" at the top of the stack.
75 .. K STACK(SP)
76 .. S SP=SP-1
77 .;
78 .;If we get to here then symbol is an operand.
79 . S PFP=PFP+1
80 . S PFSTACK(PFP)=SYMT
81 ;
82 ;Pop and output anything left on the stack.
83 F IND=SP:-1:1 D
84 . S PFP=PFP+1
85 . S PFSTACK(PFP)=STACK(IND)
86 ;
87 ;Save the number of elements in PFSTACK.
88 S PFSTACK(0)=PFP
89 Q
90 ;
91 ;=====================================================
92PUSH(STACK,ELEM) ;Push an element on the stack.
93 I '$D(STACK) S STACK(1)=ELEM,STACK(0)=1 Q
94 I STACK(0)=0 S STACK(1)=ELEM,STACK(0)=1 Q
95 N IND
96 F IND=STACK(0):-1:1 S STACK(IND+1)=STACK(IND)
97 S STACK(1)=ELEM,STACK(0)=STACK(0)+1
98 Q
99 ;
Note: See TracBrowser for help on using the repository browser.