*** COSC3308 SNOBOL EXAMPLE PROGRAM-5 11/22/2004
*** File: RecPatt.sno
*** 1. Fullscan/Quickscan (Default: &Fullscan=0)
*** Fullscan makes recursive pattern fail sometimes
*** especially when a recursive definition is given as the
*** first alternate.
*** 2. UnEvaluated Expression (The unary *) given as a part
*** of pattern
structure is not evaluated until actual pattern
*** matching takes place thereby postponing its evaluation,
which may
*** not always work in QuickScan mode.
*** 3. QuickScan assumes that *E (Unevaluation exp) matches at
least
*** one character
*** 4. In QuickScan, "ARB" behaves the same in
unanchored mode as in
*** anchored mode.
1 &Fullscan = 0
2 FT1 = *FT1 "A" |
"A" ;* Recursion first
alternate as first-component
3 Ft2 = 'A' *Ft2 | 'A' ;* Recursion first alternate as
second-component
4 SD1 = "A" | *SD1
"A" ;* Recursion second
alternate as first-component
5 Sd2 = 'A' | 'A' *Sd2 ;* Recursion second alternate as
second-component
6 string = "AAAA"
7 OUTPUT = "RECURSION SECOND
ALTERNATE as first component, QUICKSCAN"
8 string SD1 $ OUTPUT FAIL
9 Output = "Recursion SECOND
ALTERNATE as second component, QUICKSCAN"
10 string SD2 $ Output Fail
11 OUTPUT = "RECURSION FIRST
ALTERNATE as first component, QUICKSCAN"
12 string FT1 $ OUTPUT FAIL
13 output = "recursion FIRST
ALTERNATE as second component, QuickScan"
14 string Ft2 $ Output Fail
15 output =
16 OUTPUT =
17 OUTPUT = "NOW FULLSCAN MODE:::::"
18 Output =
19 &FullScan = 1
20 OUTPUT = "RECURSION SECOND
ALTERNATE as Second component"
21 string Sd2 $ Output Fail ;* Same outputs as "QuickScan"
with no stack overflow.
22 output = "Recursion SECOND
ALTERNATE as First component"
23 string SD1 $ OUTPUT FAIL ;* Stack overflow error after all matching
* substrings are printed out only starting with
position-1
* although Unanchored.
24 OUTPUT = "RECURSION FIRST
ALTERNATE as second component:"
* string FT2 $
FAIL ;*Stack overflow even
before the first output
25 define('PRINT(X,Y,Z)')
26 define('PP()')
27 THREE = LEN(1) $ A ARB LEN(1) $
B ARB LEN(1) $ C
27 + *PRINT(A,B,C) FAIL
28 OUTPUT = "ALL COMBINATIONS
IN FULLSCAN:"
29 "12345" THREE
30 OUTPUT = "NOW QUICKSCAN
MODE: ONLY FIRST TWO"
31 &FullScan = 0
32 "12345" THREE :(End)
33 PP
Loop = Loop + 1
34 OUTPUT = "REPEATING COUNT::" Loop :(RETURN)
35 Print
OUTPUT = X ' ' Y ' ' Z " " :(RETURN)
36 END
RECURSION
SECOND ALTERNATE as first component, QUICKSCAN
A
AA
AAA
AAAA
A
AA
AAA
A
AA
A
Recursion
SECOND ALTERNATE as second component, QUICKSCAN
A
AA
AAA
AAAA
A
AA
AAA
A
AA
A
RECURSION
FIRST ALTERNATE as first component, QUICKSCAN
AAAA
AAA
AA
A
AAA
AA
A
AA
A
A
recursion
FIRST ALTERNATE as second component, QuickScan
AAAA
AAA
AA
A
AAA
AA
A
AA
A
A
NOW
FULLSCAN MODE:::::
RECURSION
SECOND ALTERNATE as Second component
A
AA
AAA
AAAA
A
AA
AAA
A
AA
A
Recursion
SECOND ALTERNATE as First component
A
AA
AAA
AAAA