***     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