Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

# -*- coding: utf-8 -*- 

""" 

    pygments.lexers.snobol 

    ~~~~~~~~~~~~~~~~~~~~~~ 

 

    Lexers for the SNOBOL language. 

 

    :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS. 

    :license: BSD, see LICENSE for details. 

""" 

 

from pygments.lexer import RegexLexer, bygroups 

from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ 

    Number, Punctuation 

 

__all__ = ['SnobolLexer'] 

 

 

class SnobolLexer(RegexLexer): 

    """ 

    Lexer for the SNOBOL4 programming language. 

 

    Recognizes the common ASCII equivalents of the original SNOBOL4 operators. 

    Does not require spaces around binary operators. 

 

    .. versionadded:: 1.5 

    """ 

 

    name = "Snobol" 

    aliases = ["snobol"] 

    filenames = ['*.snobol'] 

    mimetypes = ['text/x-snobol'] 

 

    tokens = { 

        # root state, start of line 

        # comments, continuation lines, and directives start in column 1 

        # as do labels 

        'root': [ 

            (r'\*.*\n', Comment), 

            (r'[+.] ', Punctuation, 'statement'), 

            (r'-.*\n', Comment), 

            (r'END\s*\n', Name.Label, 'heredoc'), 

            (r'[A-Za-z$][\w$]*', Name.Label, 'statement'), 

            (r'\s+', Text, 'statement'), 

        ], 

        # statement state, line after continuation or label 

        'statement': [ 

            (r'\s*\n', Text, '#pop'), 

            (r'\s+', Text), 

            (r'(?<=[^\w.])(LT|LE|EQ|NE|GE|GT|INTEGER|IDENT|DIFFER|LGT|SIZE|' 

             r'REPLACE|TRIM|DUPL|REMDR|DATE|TIME|EVAL|APPLY|OPSYN|LOAD|UNLOAD|' 

             r'LEN|SPAN|BREAK|ANY|NOTANY|TAB|RTAB|REM|POS|RPOS|FAIL|FENCE|' 

             r'ABORT|ARB|ARBNO|BAL|SUCCEED|INPUT|OUTPUT|TERMINAL)(?=[^\w.])', 

             Name.Builtin), 

            (r'[A-Za-z][\w.]*', Name), 

            # ASCII equivalents of original operators 

            # | for the EBCDIC equivalent, ! likewise 

            # \ for EBCDIC negation 

            (r'\*\*|[?$.!%*/#+\-@|&\\=]', Operator), 

            (r'"[^"]*"', String), 

            (r"'[^']*'", String), 

            # Accept SPITBOL syntax for real numbers 

            # as well as Macro SNOBOL4 

            (r'[0-9]+(?=[^.EeDd])', Number.Integer), 

            (r'[0-9]+(\.[0-9]*)?([EDed][-+]?[0-9]+)?', Number.Float), 

            # Goto 

            (r':', Punctuation, 'goto'), 

            (r'[()<>,;]', Punctuation), 

        ], 

        # Goto block 

        'goto': [ 

            (r'\s*\n', Text, "#pop:2"), 

            (r'\s+', Text), 

            (r'F|S', Keyword), 

            (r'(\()([A-Za-z][\w.]*)(\))', 

             bygroups(Punctuation, Name.Label, Punctuation)) 

        ], 

        # everything after the END statement is basically one 

        # big heredoc. 

        'heredoc': [ 

            (r'.*\n', String.Heredoc) 

        ] 

    }