summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Rintsch <github.com@rintsch.de>2022-07-15 11:01:59 +0200
committerGitHub <noreply@github.com>2022-07-15 11:01:59 +0200
commita28fe722ff7b8bd6eeec0febf70bb4f8b3aee6bb (patch)
tree65c21ddaf9344b6d428839d1fa49b81dd4def278
parent0a28d842c4dff7f893d1cd73a229a6237576e2c1 (diff)
downloadpygments-git-a28fe722ff7b8bd6eeec0febf70bb4f8b3aee6bb.tar.gz
Added COMAL-80 language highlight. (#2180)
* Added COMAL-80 language highlight. Co-authored-by: Jean Abou Samra <jean@abou-samra.fr>
-rw-r--r--pygments/lexers/_mapping.py1
-rw-r--r--pygments/lexers/comal.py79
-rw-r--r--tests/examplefiles/comal80/test.comal66
-rw-r--r--tests/examplefiles/comal80/test.comal.output630
4 files changed, 776 insertions, 0 deletions
diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py
index 641f8ea0..577d6645 100644
--- a/pygments/lexers/_mapping.py
+++ b/pygments/lexers/_mapping.py
@@ -92,6 +92,7 @@ LEXERS = {
'ColdfusionCFCLexer': ('pygments.lexers.templates', 'Coldfusion CFC', ('cfc',), ('*.cfc',), ()),
'ColdfusionHtmlLexer': ('pygments.lexers.templates', 'Coldfusion HTML', ('cfm',), ('*.cfm', '*.cfml'), ('application/x-coldfusion',)),
'ColdfusionLexer': ('pygments.lexers.templates', 'cfstatement', ('cfs',), (), ()),
+ 'Comal80Lexer': ('pygments.lexers.comal', 'COMAL-80', ('comal', 'comal80'), ('*.cml', '*.comal'), ()),
'CommonLispLexer': ('pygments.lexers.lisp', 'Common Lisp', ('common-lisp', 'cl', 'lisp'), ('*.cl', '*.lisp'), ('text/x-common-lisp',)),
'ComponentPascalLexer': ('pygments.lexers.oberon', 'Component Pascal', ('componentpascal', 'cp'), ('*.cp', '*.cps'), ('text/x-component-pascal',)),
'CoqLexer': ('pygments.lexers.theorem', 'Coq', ('coq',), ('*.v',), ('text/x-coq',)),
diff --git a/pygments/lexers/comal.py b/pygments/lexers/comal.py
new file mode 100644
index 00000000..e8180d45
--- /dev/null
+++ b/pygments/lexers/comal.py
@@ -0,0 +1,79 @@
+"""
+ pygments.lexers.comal
+ ~~~~~~~~~~~~~~~~~~~~~
+
+ Lexer for COMAL-80.
+
+ :copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import *
+
+__all__ = ["Comal80Lexer"]
+
+
+class Comal80Lexer(RegexLexer):
+ """
+ For COMAL-80 source code.
+ """
+
+ name = 'COMAL-80'
+ url = 'https://en.wikipedia.org/wiki/COMAL'
+ aliases = ['comal', 'comal80']
+ filenames = ['*.cml', '*.comal']
+ flags = re.IGNORECASE
+ #
+ # COMAL allows for some strange characters in names which we list here so
+ # keywords and word operators will not be recognized at the start of an
+ # identifier.
+ #
+ _suffix = r"\b(?!['\[\]←£\\])"
+ _identifier = r"[a-z]['\[\]←£\\\w]*"
+
+ tokens = {
+ 'root': [
+ (r'//.*\n', Comment.Single),
+ (r'\s+', Whitespace),
+ (r':[=+-]|\<\>|[-+*/^↑<>=]', Operator),
+ (r'(and +then|or +else)' + _suffix, Operator.Word),
+ (words([
+ 'and', 'bitand', 'bitor', 'bitxor', 'div', 'in', 'mod', 'not',
+ 'or'], suffix=_suffix,), Operator.Word),
+ (words([
+ 'append', 'at', 'case', 'chain', 'close', 'copy', 'create', 'cursor',
+ 'data', 'delete', 'dir', 'do', 'elif', 'else', 'end', 'endcase', 'endif',
+ 'endfor', 'endloop', 'endtrap', 'endwhile', 'exec', 'exit', 'file',
+ 'for', 'goto', 'handler', 'if', 'input', 'let', 'loop', 'mount', 'null',
+ 'of', 'open', 'otherwise', 'output', 'page', 'pass', 'poke', 'print',
+ 'random', 'read', 'repeat', 'report', 'return', 'rename', 'restore',
+ 'select', 'step', 'stop', 'sys', 'then', 'to', 'trap', 'unit', 'unit$',
+ 'until', 'using', 'when', 'while', 'write', 'zone'], suffix=_suffix),
+ Keyword.Reserved),
+ (words([
+ 'closed', 'dim', 'endfunc', 'endproc', 'external', 'func', 'import',
+ 'proc', 'ref', 'use'], suffix=_suffix), Keyword.Declaration),
+ (words([
+ 'abs', 'atn', 'chr$', 'cos', 'eod', 'eof', 'err', 'errfile', 'errtext',
+ 'esc', 'exp', 'int', 'key$', 'len', 'log', 'ord', 'peek', 'randomize',
+ 'rnd', 'sgn', 'sin', 'spc$', 'sqr', 'status$', 'str$', 'tab', 'tan',
+ 'time', 'val'], suffix=_suffix), Name.Builtin),
+ (words(['false', 'pi', 'true'], suffix=_suffix), Keyword.Constant),
+ (r'"', String, 'string'),
+ (_identifier + r":(?=[ \n/])", Name.Label),
+ (_identifier + r"[$#]?", Name),
+ (r'%[01]+', Number.Bin),
+ (r'\$[0-9a-f]+', Number.Hex),
+ (r'\d*\.\d*(e[-+]?\d+)?', Number.Float),
+ (r'\d+', Number.Integer),
+ (r'[(),:;]', Punctuation),
+ ],
+ 'string': [
+ (r'[^"]+', String),
+ (r'"[0-9]*"', String.Escape),
+ (r'"', String, '#pop'),
+ ],
+ }
diff --git a/tests/examplefiles/comal80/test.comal b/tests/examplefiles/comal80/test.comal
new file mode 100644
index 00000000..81ce3047
--- /dev/null
+++ b/tests/examplefiles/comal80/test.comal
@@ -0,0 +1,66 @@
+0010 // This is a line comment.
+0020
+0030 a_name'with←very[strange]characters\in£it
+0040 // Are keywords and word operators at start of names safe?
+0050 do'something
+0060 and←then'something'different
+0070 case[closed
+0080 closed]it'is
+0090 eod\really
+0100 true£or'false
+0110 false_and'true
+0120 IF a AND then←some THEN NULL
+0130
+0140 text$:="some text"; a:=42; b:=TRUE; c:=FALSE; full'circle:=2*PI
+0150 address#:=$d020; mask#:=%00001111 // Hex & bin numbers.
+0160 DIM field(-1:1,-1:1) // 3x3 array with 0,0 at the center.
+0170 DIM buffer$ OF 1024,lines$(100) OF 80,xs(low:high)
+0180
+0190 PRINT "She said ""Hello!"" to the world."
+0200 PRINT "Embedding "18"byte values"146" into a string."
+0210 PRINT "42";"";"Hallo";""0""
+0220
+0230 // Short circuit operators OR ELSE and AND THEN contain keywords.
+0240 IF a OR ELSE b AND THEN c THEN do'something
+0250
+0260 // Optional keywords.
+0270 EXEC some'procedure
+0280 LET answer:=42
+0290
+0300 FOR i:=0 TO 10
+0310 PRINT "fib(",i,") =";fib(i)
+0320 ENDFOR i
+0330
+0340 RESTORE this'is'a'label
+0350 WHILE NOT EOD
+0360 READ language$,version
+0370 PRINT language$;"version";version
+0380 ENDWHILE
+0390
+0400 t$=""
+0410 REPEAT
+0420 max'length:=LEN(t$)
+0430 t$:+"x"
+0440 UNTIL LEN(t$)=max'length
+0450 PRINT "UnDIMed strings have a max length of";max'length
+0460
+0470 PROC swap(REF a, REF b) CLOSED
+0480 tmp:=a; a:=b; b:=tmp
+0490 ENDPROC swap
+0500
+0510 PROC shuffle(n, REF values()) CLOSED
+0520 IMPORT swap
+0530 FOR i:=n TO 1 STEP -1 DO swap(values(i), values(RND(1,i)))
+0540 ENDPROC shuffle
+0550
+0560 FUNC fib(n) CLOSED
+0570 IF n<2 THEN
+0580 RETURN n
+0590 ELSE
+0600 RETURN fib(n-1)+fib(n-2)
+0610 ENDIF
+0620 ENDFUNC fib
+0630
+0640 this'is'a'label:
+0650 and'a'label: // with comment.
+0660 DATA "CBM BASIC",2,"Comal",80,"Python",3.7
diff --git a/tests/examplefiles/comal80/test.comal.output b/tests/examplefiles/comal80/test.comal.output
new file mode 100644
index 00000000..478f5bc9
--- /dev/null
+++ b/tests/examplefiles/comal80/test.comal.output
@@ -0,0 +1,630 @@
+'0010' Literal.Number.Integer
+' ' Text.Whitespace
+'// This is a line comment.\n' Comment.Single
+
+'0020' Literal.Number.Integer
+' \n' Text.Whitespace
+
+'0030' Literal.Number.Integer
+' ' Text.Whitespace
+"a_name'with←very[strange]characters\\in£it" Name
+'\n' Text.Whitespace
+
+'0040' Literal.Number.Integer
+' ' Text.Whitespace
+'// Are keywords and word operators at start of names safe?\n' Comment.Single
+
+'0050' Literal.Number.Integer
+' ' Text.Whitespace
+"do'something" Name
+'\n' Text.Whitespace
+
+'0060' Literal.Number.Integer
+' ' Text.Whitespace
+"and←then'something'different" Name
+'\n' Text.Whitespace
+
+'0070' Literal.Number.Integer
+' ' Text.Whitespace
+'case[closed' Name
+'\n' Text.Whitespace
+
+'0080' Literal.Number.Integer
+' ' Text.Whitespace
+"closed]it'is" Name
+'\n' Text.Whitespace
+
+'0090' Literal.Number.Integer
+' ' Text.Whitespace
+'eod\\really' Name
+'\n' Text.Whitespace
+
+'0100' Literal.Number.Integer
+' ' Text.Whitespace
+"true£or'false" Name
+'\n' Text.Whitespace
+
+'0110' Literal.Number.Integer
+' ' Text.Whitespace
+"false_and'true" Name
+'\n' Text.Whitespace
+
+'0120' Literal.Number.Integer
+' ' Text.Whitespace
+'IF' Keyword.Reserved
+' ' Text.Whitespace
+'a' Name
+' ' Text.Whitespace
+'AND' Operator.Word
+' ' Text.Whitespace
+'then←some' Name
+' ' Text.Whitespace
+'THEN' Keyword.Reserved
+' ' Text.Whitespace
+'NULL' Keyword.Reserved
+'\n' Text.Whitespace
+
+'0130' Literal.Number.Integer
+' \n' Text.Whitespace
+
+'0140' Literal.Number.Integer
+' ' Text.Whitespace
+'text$' Name
+':=' Operator
+'"' Literal.String
+'some text' Literal.String
+'"' Literal.String
+';' Punctuation
+' ' Text.Whitespace
+'a' Name
+':=' Operator
+'42' Literal.Number.Integer
+';' Punctuation
+' ' Text.Whitespace
+'b' Name
+':=' Operator
+'TRUE' Keyword.Constant
+';' Punctuation
+' ' Text.Whitespace
+'c' Name
+':=' Operator
+'FALSE' Keyword.Constant
+';' Punctuation
+' ' Text.Whitespace
+"full'circle" Name
+':=' Operator
+'2' Literal.Number.Integer
+'*' Operator
+'PI' Keyword.Constant
+'\n' Text.Whitespace
+
+'0150' Literal.Number.Integer
+' ' Text.Whitespace
+'address#' Name
+':=' Operator
+'$d020' Literal.Number.Hex
+';' Punctuation
+' ' Text.Whitespace
+'mask#' Name
+':=' Operator
+'%00001111' Literal.Number.Bin
+' ' Text.Whitespace
+'// Hex & bin numbers.\n' Comment.Single
+
+'0160' Literal.Number.Integer
+' ' Text.Whitespace
+'DIM' Keyword.Declaration
+' ' Text.Whitespace
+'field' Name
+'(' Punctuation
+'-' Operator
+'1' Literal.Number.Integer
+':' Punctuation
+'1' Literal.Number.Integer
+',' Punctuation
+'-' Operator
+'1' Literal.Number.Integer
+':' Punctuation
+'1' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'// 3x3 array with 0,0 at the center.\n' Comment.Single
+
+'0170' Literal.Number.Integer
+' ' Text.Whitespace
+'DIM' Keyword.Declaration
+' ' Text.Whitespace
+'buffer$' Name
+' ' Text.Whitespace
+'OF' Keyword.Reserved
+' ' Text.Whitespace
+'1024' Literal.Number.Integer
+',' Punctuation
+'lines$' Name
+'(' Punctuation
+'100' Literal.Number.Integer
+')' Punctuation
+' ' Text.Whitespace
+'OF' Keyword.Reserved
+' ' Text.Whitespace
+'80' Literal.Number.Integer
+',' Punctuation
+'xs' Name
+'(' Punctuation
+'low' Name
+':' Punctuation
+'high' Name
+')' Punctuation
+'\n' Text.Whitespace
+
+'0180' Literal.Number.Integer
+' \n' Text.Whitespace
+
+'0190' Literal.Number.Integer
+' ' Text.Whitespace
+'PRINT' Keyword.Reserved
+' ' Text.Whitespace
+'"' Literal.String
+'She said ' Literal.String
+'""' Literal.String.Escape
+'Hello!' Literal.String
+'""' Literal.String.Escape
+' to the world.' Literal.String
+'"' Literal.String
+'\n' Text.Whitespace
+
+'0200' Literal.Number.Integer
+' ' Text.Whitespace
+'PRINT' Keyword.Reserved
+' ' Text.Whitespace
+'"' Literal.String
+'Embedding ' Literal.String
+'"18"' Literal.String.Escape
+'byte values' Literal.String
+'"146"' Literal.String.Escape
+' into a string.' Literal.String
+'"' Literal.String
+'\n' Text.Whitespace
+
+'0210' Literal.Number.Integer
+' ' Text.Whitespace
+'PRINT' Keyword.Reserved
+' ' Text.Whitespace
+'"' Literal.String
+'42' Literal.String
+'"' Literal.String
+';' Punctuation
+'"' Literal.String
+'"' Literal.String
+';' Punctuation
+'"' Literal.String
+'Hallo' Literal.String
+'"' Literal.String
+';' Punctuation
+'"' Literal.String
+'"0"' Literal.String.Escape
+'"' Literal.String
+'\n' Text.Whitespace
+
+'0220' Literal.Number.Integer
+' \n' Text.Whitespace
+
+'0230' Literal.Number.Integer
+' ' Text.Whitespace
+'// Short circuit operators OR ELSE and AND THEN contain keywords.\n' Comment.Single
+
+'0240' Literal.Number.Integer
+' ' Text.Whitespace
+'IF' Keyword.Reserved
+' ' Text.Whitespace
+'a' Name
+' ' Text.Whitespace
+'OR ELSE' Operator.Word
+' ' Text.Whitespace
+'b' Name
+' ' Text.Whitespace
+'AND THEN' Operator.Word
+' ' Text.Whitespace
+'c' Name
+' ' Text.Whitespace
+'THEN' Keyword.Reserved
+' ' Text.Whitespace
+"do'something" Name
+'\n' Text.Whitespace
+
+'0250' Literal.Number.Integer
+' \n' Text.Whitespace
+
+'0260' Literal.Number.Integer
+' ' Text.Whitespace
+'// Optional keywords.\n' Comment.Single
+
+'0270' Literal.Number.Integer
+' ' Text.Whitespace
+'EXEC' Keyword.Reserved
+' ' Text.Whitespace
+"some'procedure" Name
+'\n' Text.Whitespace
+
+'0280' Literal.Number.Integer
+' ' Text.Whitespace
+'LET' Keyword.Reserved
+' ' Text.Whitespace
+'answer' Name
+':=' Operator
+'42' Literal.Number.Integer
+'\n' Text.Whitespace
+
+'0290' Literal.Number.Integer
+' \n' Text.Whitespace
+
+'0300' Literal.Number.Integer
+' ' Text.Whitespace
+'FOR' Keyword.Reserved
+' ' Text.Whitespace
+'i' Name
+':=' Operator
+'0' Literal.Number.Integer
+' ' Text.Whitespace
+'TO' Keyword.Reserved
+' ' Text.Whitespace
+'10' Literal.Number.Integer
+'\n' Text.Whitespace
+
+'0310' Literal.Number.Integer
+' ' Text.Whitespace
+'PRINT' Keyword.Reserved
+' ' Text.Whitespace
+'"' Literal.String
+'fib(' Literal.String
+'"' Literal.String
+',' Punctuation
+'i' Name
+',' Punctuation
+'"' Literal.String
+') =' Literal.String
+'"' Literal.String
+';' Punctuation
+'fib' Name
+'(' Punctuation
+'i' Name
+')' Punctuation
+'\n' Text.Whitespace
+
+'0320' Literal.Number.Integer
+' ' Text.Whitespace
+'ENDFOR' Keyword.Reserved
+' ' Text.Whitespace
+'i' Name
+'\n' Text.Whitespace
+
+'0330' Literal.Number.Integer
+' \n' Text.Whitespace
+
+'0340' Literal.Number.Integer
+' ' Text.Whitespace
+'RESTORE' Keyword.Reserved
+' ' Text.Whitespace
+"this'is'a'label" Name
+'\n' Text.Whitespace
+
+'0350' Literal.Number.Integer
+' ' Text.Whitespace
+'WHILE' Keyword.Reserved
+' ' Text.Whitespace
+'NOT' Operator.Word
+' ' Text.Whitespace
+'EOD' Name.Builtin
+'\n' Text.Whitespace
+
+'0360' Literal.Number.Integer
+' ' Text.Whitespace
+'READ' Keyword.Reserved
+' ' Text.Whitespace
+'language$' Name
+',' Punctuation
+'version' Name
+'\n' Text.Whitespace
+
+'0370' Literal.Number.Integer
+' ' Text.Whitespace
+'PRINT' Keyword.Reserved
+' ' Text.Whitespace
+'language$' Name
+';' Punctuation
+'"' Literal.String
+'version' Literal.String
+'"' Literal.String
+';' Punctuation
+'version' Name
+'\n' Text.Whitespace
+
+'0380' Literal.Number.Integer
+' ' Text.Whitespace
+'ENDWHILE' Keyword.Reserved
+'\n' Text.Whitespace
+
+'0390' Literal.Number.Integer
+' \n' Text.Whitespace
+
+'0400' Literal.Number.Integer
+' ' Text.Whitespace
+'t$' Name
+'=' Operator
+'"' Literal.String
+'"' Literal.String
+'\n' Text.Whitespace
+
+'0410' Literal.Number.Integer
+' ' Text.Whitespace
+'REPEAT' Keyword.Reserved
+'\n' Text.Whitespace
+
+'0420' Literal.Number.Integer
+' ' Text.Whitespace
+"max'length" Name
+':=' Operator
+'LEN' Name.Builtin
+'(' Punctuation
+'t$' Name
+')' Punctuation
+'\n' Text.Whitespace
+
+'0430' Literal.Number.Integer
+' ' Text.Whitespace
+'t$' Name
+':+' Operator
+'"' Literal.String
+'x' Literal.String
+'"' Literal.String
+'\n' Text.Whitespace
+
+'0440' Literal.Number.Integer
+' ' Text.Whitespace
+'UNTIL' Keyword.Reserved
+' ' Text.Whitespace
+'LEN' Name.Builtin
+'(' Punctuation
+'t$' Name
+')' Punctuation
+'=' Operator
+"max'length" Name
+'\n' Text.Whitespace
+
+'0450' Literal.Number.Integer
+' ' Text.Whitespace
+'PRINT' Keyword.Reserved
+' ' Text.Whitespace
+'"' Literal.String
+'UnDIMed strings have a max length of' Literal.String
+'"' Literal.String
+';' Punctuation
+"max'length" Name
+'\n' Text.Whitespace
+
+'0460' Literal.Number.Integer
+' \n' Text.Whitespace
+
+'0470' Literal.Number.Integer
+' ' Text.Whitespace
+'PROC' Keyword.Declaration
+' ' Text.Whitespace
+'swap' Name
+'(' Punctuation
+'REF' Keyword.Declaration
+' ' Text.Whitespace
+'a' Name
+',' Punctuation
+' ' Text.Whitespace
+'REF' Keyword.Declaration
+' ' Text.Whitespace
+'b' Name
+')' Punctuation
+' ' Text.Whitespace
+'CLOSED' Keyword.Declaration
+'\n' Text.Whitespace
+
+'0480' Literal.Number.Integer
+' ' Text.Whitespace
+'tmp' Name
+':=' Operator
+'a' Name
+';' Punctuation
+' ' Text.Whitespace
+'a' Name
+':=' Operator
+'b' Name
+';' Punctuation
+' ' Text.Whitespace
+'b' Name
+':=' Operator
+'tmp' Name
+'\n' Text.Whitespace
+
+'0490' Literal.Number.Integer
+' ' Text.Whitespace
+'ENDPROC' Keyword.Declaration
+' ' Text.Whitespace
+'swap' Name
+'\n' Text.Whitespace
+
+'0500' Literal.Number.Integer
+' \n' Text.Whitespace
+
+'0510' Literal.Number.Integer
+' ' Text.Whitespace
+'PROC' Keyword.Declaration
+' ' Text.Whitespace
+'shuffle' Name
+'(' Punctuation
+'n' Name
+',' Punctuation
+' ' Text.Whitespace
+'REF' Keyword.Declaration
+' ' Text.Whitespace
+'values' Name
+'(' Punctuation
+')' Punctuation
+')' Punctuation
+' ' Text.Whitespace
+'CLOSED' Keyword.Declaration
+'\n' Text.Whitespace
+
+'0520' Literal.Number.Integer
+' ' Text.Whitespace
+'IMPORT' Keyword.Declaration
+' ' Text.Whitespace
+'swap' Name
+'\n' Text.Whitespace
+
+'0530' Literal.Number.Integer
+' ' Text.Whitespace
+'FOR' Keyword.Reserved
+' ' Text.Whitespace
+'i' Name
+':=' Operator
+'n' Name
+' ' Text.Whitespace
+'TO' Keyword.Reserved
+' ' Text.Whitespace
+'1' Literal.Number.Integer
+' ' Text.Whitespace
+'STEP' Keyword.Reserved
+' ' Text.Whitespace
+'-' Operator
+'1' Literal.Number.Integer
+' ' Text.Whitespace
+'DO' Keyword.Reserved
+' ' Text.Whitespace
+'swap' Name
+'(' Punctuation
+'values' Name
+'(' Punctuation
+'i' Name
+')' Punctuation
+',' Punctuation
+' ' Text.Whitespace
+'values' Name
+'(' Punctuation
+'RND' Name.Builtin
+'(' Punctuation
+'1' Literal.Number.Integer
+',' Punctuation
+'i' Name
+')' Punctuation
+')' Punctuation
+')' Punctuation
+'\n' Text.Whitespace
+
+'0540' Literal.Number.Integer
+' ' Text.Whitespace
+'ENDPROC' Keyword.Declaration
+' ' Text.Whitespace
+'shuffle' Name
+'\n' Text.Whitespace
+
+'0550' Literal.Number.Integer
+' \n' Text.Whitespace
+
+'0560' Literal.Number.Integer
+' ' Text.Whitespace
+'FUNC' Keyword.Declaration
+' ' Text.Whitespace
+'fib' Name
+'(' Punctuation
+'n' Name
+')' Punctuation
+' ' Text.Whitespace
+'CLOSED' Keyword.Declaration
+'\n' Text.Whitespace
+
+'0570' Literal.Number.Integer
+' ' Text.Whitespace
+'IF' Keyword.Reserved
+' ' Text.Whitespace
+'n' Name
+'<' Operator
+'2' Literal.Number.Integer
+' ' Text.Whitespace
+'THEN' Keyword.Reserved
+'\n' Text.Whitespace
+
+'0580' Literal.Number.Integer
+' ' Text.Whitespace
+'RETURN' Keyword.Reserved
+' ' Text.Whitespace
+'n' Name
+'\n' Text.Whitespace
+
+'0590' Literal.Number.Integer
+' ' Text.Whitespace
+'ELSE' Keyword.Reserved
+'\n' Text.Whitespace
+
+'0600' Literal.Number.Integer
+' ' Text.Whitespace
+'RETURN' Keyword.Reserved
+' ' Text.Whitespace
+'fib' Name
+'(' Punctuation
+'n' Name
+'-' Operator
+'1' Literal.Number.Integer
+')' Punctuation
+'+' Operator
+'fib' Name
+'(' Punctuation
+'n' Name
+'-' Operator
+'2' Literal.Number.Integer
+')' Punctuation
+'\n' Text.Whitespace
+
+'0610' Literal.Number.Integer
+' ' Text.Whitespace
+'ENDIF' Keyword.Reserved
+'\n' Text.Whitespace
+
+'0620' Literal.Number.Integer
+' ' Text.Whitespace
+'ENDFUNC' Keyword.Declaration
+' ' Text.Whitespace
+'fib' Name
+'\n' Text.Whitespace
+
+'0630' Literal.Number.Integer
+' \n' Text.Whitespace
+
+'0640' Literal.Number.Integer
+' ' Text.Whitespace
+"this'is'a'label:" Name.Label
+'\n' Text.Whitespace
+
+'0650' Literal.Number.Integer
+' ' Text.Whitespace
+"and'a'label:" Name.Label
+' ' Text.Whitespace
+'// with comment.\n' Comment.Single
+
+'0660' Literal.Number.Integer
+' ' Text.Whitespace
+'DATA' Keyword.Reserved
+' ' Text.Whitespace
+'"' Literal.String
+'CBM BASIC' Literal.String
+'"' Literal.String
+',' Punctuation
+'2' Literal.Number.Integer
+',' Punctuation
+'"' Literal.String
+'Comal' Literal.String
+'"' Literal.String
+',' Punctuation
+'80' Literal.Number.Integer
+',' Punctuation
+'"' Literal.String
+'Python' Literal.String
+'"' Literal.String
+',' Punctuation
+'3.7' Literal.Number.Float
+'\n' Text.Whitespace