# SNOBOL

示例内容来自 A Snobol4 Tutorial (opens new window)。经验证可以使用。

SNOBOL4 编译/解释器可以在 snobol4.org 下载。

# cat.sno 读取标注输入输出到标准输出

        N = 0
COPY    OUTPUT = INPUT      :F(DONE)
        N = N + 1           :(COPY)
DONE    OUTPUT = 'There were ' N ' lines.'
END

# ascii.sno 转换字符的ASCII

    CHAR = 'A'
    &ALPHABET @N CHAR
    OUTPUT = N
END

# triplets.sno 格式化输出文本

        &TRIM = 1
        N = 0
LOOP    S = INPUT           :F(END)
        OUTPUT = DUPL(' ', (80 - SIZE(S))) S
        N = REMDR(N + 1, 3)
        OUTPUT = EQ(N, 0)   :(LOOP)
END

# fcounts.sno 统计文件行数和字符数

        &TRIM = 1
        CHARS = 0
NEXTL   CHARS = CHARS + SIZE(INPUT)     :F(DONE)
        LINES = LINES + 1               :(NEXTL)
DONE    OUTPUT = CHARS ' characters,'
        OUTPUT = +LINES ' lines read.'
END

# words.sno 统计文件词数

        &TRIM = 1
        WORD = "'-" '0123456789' &UCASE &LCASE
        WPAT = BREAK(WORD) SPAN(WORD)
NEXTL   LINE = INPUT    :F(DONE)
NEXTW   LINE WPAT =     :F(NEXTL)
        N = N + 1         :(NEXTW)
DONE    OUTPUT = +N ' words'
END

# pattern.sno 模式匹配实例

* Alternates and Capture
    B = 'BlueBird'
    COLOR = ('Gold' | 'Blue') . SHADE
    CRITTER = ('Fish' | 'Bird') . ANIMAL
    BOTH = COLOR CRITTER
    B BOTH
    OUTPUT = 'Shade: ' SHADE
    OUTPUT = 'Animal: ' ANIMAL
* Remainder part
    'THE WINTER WINDS' 'WIN' REM . OUTPUT
    'THE WINTER WINDS' 'WINDS' REM . OUTPUT
* Arbitrary characters
    'MOUNTAIN' 'O' ARB . OUTPUT 'A'
    'MOUNTAIN' 'O' ARB . OUTPUT 'U'
* Cursor position
    'DOUBT' @OUTPUT 'B'
    'FIX' @OUTPUT 'B'
* Length
    'ABCDA' LEN(3) . OUTPUT
    'ABCDA' LEN(2) . OUTPUT 'A'
* Position (Assertion)
    'ABCDA' POS(0) 'B'
    'ABCDA' LEN(3) . OUTPUT RPOS(0)
    'ABCDA' POS(3) LEN(1) . OUTPUT
    'ABCDA' POS(0) 'ABCD' RPOS(0)
* Position (Match)
    'ABCDA' TAB(2) . OUTPUT RTAB(1) . OUTPUT
* Character Patterns
    VOWEL = ANY('AEIOU')
    DVOWEL = VOWEL VOWEL
    NOTVOWEL = NOTANY('AEIOU')
    'VACUUM' VOWEL . OUTPUT
    'VACUUM' DVOWEL . OUTPUT
    'VACUUM' (VOWEL NOTVOWEL) . OUTPUT
* Span & Break
    LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ'-"
    WORD = SPAN(LETTERS)
    GAP = BREAK(LETTERS)
    'SAMPLE LINE' WORD . OUTPUT
    'PLUS TEN DEGREES' ' ' WORD . OUTPUT
    GAPO = GAP . OUTPUT
    WORDO = WORD . OUTPUT
    ': ONE, TWO, THREE' GAPO WORDO GAPO WORDO
    DIGITS = '0123456789'
    INTEGER = (ANY('+-') | '') SPAN(DIGITS)
    'SET -43 VOLTS' INTEGER . OUTPUT
    REAL = INTEGER '.' (SPAN(DIGITS) | '')
    'SET -43.625 VOLTS' REAL . OUTPUT

    S = '0ZERO,1ONE,2TWO,3THREE,4FOUR,5FIVE,'
    S 4 BREAK(',') . OUTPUT

END

# cross.sno 综合示例:纵横字

        &TRIM = 1
AGAIN   OUTPUT = 'ENTER HORIZONTAL WORD:'
        H = INPUT                       :F(END)
        OUTPUT = 'ENTER VERTICAL WORD:'
        V = INPUT                       :F(END)
        HC = H
NEXTH   HC @NH ANY(V) . CROSS = '*'     :F(AGAIN)
        VC = V
NEXTV   VC @NV CROSS = '#'              :F(NEXTH)
        OUTPUT =
        PRINTV = V
        PRINTV POS(NV) LEN(1) = '#'

PRINT   PRINTV LEN(1) . C =             :F(NEXTV)
        OUTPUT = DIFFER(C, '#') DUPL(' ', NH) C     :S(PRINT)
        OUTPUT = H                      :(PRINT)
END