diff options
author | Marc Rintsch <github.com@rintsch.de> | 2022-07-15 11:01:59 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-15 11:01:59 +0200 |
commit | a28fe722ff7b8bd6eeec0febf70bb4f8b3aee6bb (patch) | |
tree | 65c21ddaf9344b6d428839d1fa49b81dd4def278 | |
parent | 0a28d842c4dff7f893d1cd73a229a6237576e2c1 (diff) | |
download | pygments-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.py | 1 | ||||
-rw-r--r-- | pygments/lexers/comal.py | 79 | ||||
-rw-r--r-- | tests/examplefiles/comal80/test.comal | 66 | ||||
-rw-r--r-- | tests/examplefiles/comal80/test.comal.output | 630 |
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 |