diff options
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | pygments/lexers/_mapping.py | 1 | ||||
-rw-r--r-- | pygments/lexers/carbon.py | 70 | ||||
-rw-r--r-- | tests/examplefiles/carbon/example.carbon | 19 | ||||
-rw-r--r-- | tests/examplefiles/carbon/example.carbon.output | 219 |
5 files changed, 310 insertions, 0 deletions
@@ -261,5 +261,6 @@ Other contributors, listed alphabetically, are: * Thomas Voss -- Sed lexer * Martin Fischer -- WCAG contrast testing * Marc Auberer -- Spice lexer +* Amr Hesham -- Carbon lexer Many thanks for all contributions! diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py index bf56bb8e..e0015fe2 100644 --- a/pygments/lexers/_mapping.py +++ b/pygments/lexers/_mapping.py @@ -71,6 +71,7 @@ LEXERS = { 'CadlLexer': ('pygments.lexers.archetype', 'cADL', ('cadl',), ('*.cadl',), ()), 'CapDLLexer': ('pygments.lexers.esoteric', 'CapDL', ('capdl',), ('*.cdl',), ()), 'CapnProtoLexer': ('pygments.lexers.capnproto', "Cap'n Proto", ('capnp',), ('*.capnp',), ()), + 'CarbonLexer': ('pygments.lexers.carbon', 'Carbon', ('carbon',), ('*.carbon',), ('text/x-carbon',)), 'CbmBasicV2Lexer': ('pygments.lexers.basic', 'CBM BASIC V2', ('cbmbas',), ('*.bas',), ()), 'CddlLexer': ('pygments.lexers.cddl', 'CDDL', ('cddl',), ('*.cddl',), ('text/x-cddl',)), 'CeylonLexer': ('pygments.lexers.jvm', 'Ceylon', ('ceylon',), ('*.ceylon',), ('text/x-ceylon',)), diff --git a/pygments/lexers/carbon.py b/pygments/lexers/carbon.py new file mode 100644 index 00000000..3ecd6153 --- /dev/null +++ b/pygments/lexers/carbon.py @@ -0,0 +1,70 @@ +""" + pygments.lexers.carbon + ~~~~~~~~~~~~~~~~~~~~~~ + + Lexers for the Carbon programming language. + + :copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" +import re + +from pygments.lexer import RegexLexer, bygroups, words +from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ + Number, Punctuation, Whitespace + +__all__ = ['CarbonLexer'] + + +class CarbonLexer(RegexLexer): + """ + For Carbon source. + + .. versionadded:: 2.15.0 + """ + name = 'Carbon' + url = 'https://github.com/carbon-language/carbon-lang' + filenames = ['*.carbon'] + aliases = ['carbon'] + mimetypes = ['text/x-carbon'] + + flags = re.MULTILINE | re.DOTALL + + tokens = { + 'root': [ + (r'\n', Whitespace), + (r'\s+', Whitespace), + (r'\\\n', Text), + # comments + (r'//(.*?)\n', Comment.Single), + (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline), + # Declaration + (r'(package|import|api|namespace|library)\b', Keyword.Namespace), + (r'(abstract|alias|fn|class|interface|let|var|virtual|external|' + r'base|addr|extends)\b', Keyword.Declaration), + # Keywords + (words(('as', 'or', 'not', 'and', 'break', 'continue', 'case', + 'default', 'if', 'else', 'destructor', 'for', 'forall', + 'while', 'where', 'then', 'in', 'is', 'return', + 'returned'), suffix=r'\b'), Keyword), + (r'(self)\b', Keyword.Pseudo), + (r'(true|false)\b', Keyword.Constant), + (r'(auto|bool|string|i8|i16|i32|i64|u8|u16|u32|u64|' + r'f8|f16|f32|f64)\b', Keyword.Type), + # numeric literals + (r'[0-9]*[.][0-9]+', Number.Double), + (r'0b[01]+[sl]?', Number.Bin), + (r'0o[0-7]+[sl]?', Number.Oct), + (r'[0-9]+', Number.Integer), + # string literal + (r'"(\\.|[^"\\])*"', String), + # char literal + (r'\'(\\.|[^\'\\])\'', String.Char), + # tokens + (r'<<=|>>=|<<|>>|<=|>=|\+=|-=|\*=|/=|\%=|\|=|&=|\^=|&&|\|\||&|\||' + r'\+\+|--|\%|\^|\~|==|!=|::|[.]{3}|[+\-*/&]|->|=>', Operator), + (r'[|<>=!()\[\]{}.,;:\?]', Punctuation), + # identifiers + (r'[^\W\d]\w*', Name.Other), + ] + } diff --git a/tests/examplefiles/carbon/example.carbon b/tests/examplefiles/carbon/example.carbon new file mode 100644 index 00000000..9f906023 --- /dev/null +++ b/tests/examplefiles/carbon/example.carbon @@ -0,0 +1,19 @@ +package Sorting api; + +fn Partition[T: !Comparable & Movable](s : Slice(T)) -> i64 { + var i: i64 = -1; + for (e: T in s) { + ++i; + Swap(&s[i], &e); + } + return i; +} + +fb QuickSort[T: !Comparable & Movable](s : Slice(T)) { + if (s.Size() <= 1) { + return; + } + let p: i64 = Partition(s); + QuickSort(s[:p - 1]); + QuickSort(s[p + 1:]); +}
\ No newline at end of file diff --git a/tests/examplefiles/carbon/example.carbon.output b/tests/examplefiles/carbon/example.carbon.output new file mode 100644 index 00000000..70d0db25 --- /dev/null +++ b/tests/examplefiles/carbon/example.carbon.output @@ -0,0 +1,219 @@ +'package' Keyword.Namespace +' ' Text.Whitespace +'Sorting' Name.Other +' ' Text.Whitespace +'api' Keyword.Namespace +';' Punctuation +'\n' Text.Whitespace + +'\n' Text.Whitespace + +'fn' Keyword.Declaration +' ' Text.Whitespace +'Partition' Name.Other +'[' Punctuation +'T' Name.Other +':' Punctuation +' ' Text.Whitespace +'!' Punctuation +'Comparable' Name.Other +' ' Text.Whitespace +'&' Operator +' ' Text.Whitespace +'Movable' Name.Other +']' Punctuation +'(' Punctuation +'s' Name.Other +' ' Text.Whitespace +':' Punctuation +' ' Text.Whitespace +'Slice' Name.Other +'(' Punctuation +'T' Name.Other +')' Punctuation +')' Punctuation +' ' Text.Whitespace +'-' Operator +'>' Punctuation +' ' Text.Whitespace +'i64' Keyword.Type +' ' Text.Whitespace +'{' Punctuation +'\n' Text.Whitespace + +' ' Text.Whitespace +'var' Keyword.Declaration +' ' Text.Whitespace +'i' Name.Other +':' Punctuation +' ' Text.Whitespace +'i64' Keyword.Type +' ' Text.Whitespace +'=' Punctuation +' ' Text.Whitespace +'-' Operator +'1' Literal.Number.Integer +';' Punctuation +'\n' Text.Whitespace + +' ' Text.Whitespace +'for' Keyword +' ' Text.Whitespace +'(' Punctuation +'e' Name.Other +':' Punctuation +' ' Text.Whitespace +'T' Name.Other +' ' Text.Whitespace +'in' Keyword +' ' Text.Whitespace +'s' Name.Other +')' Punctuation +' ' Text.Whitespace +'{' Punctuation +'\n' Text.Whitespace + +' ' Text.Whitespace +'++' Operator +'i' Name.Other +';' Punctuation +'\n' Text.Whitespace + +' ' Text.Whitespace +'Swap' Name.Other +'(' Punctuation +'&' Operator +'s' Name.Other +'[' Punctuation +'i' Name.Other +']' Punctuation +',' Punctuation +' ' Text.Whitespace +'&' Operator +'e' Name.Other +')' Punctuation +';' Punctuation +'\n' Text.Whitespace + +' ' Text.Whitespace +'}' Punctuation +'\n' Text.Whitespace + +' ' Text.Whitespace +'return' Keyword +' ' Text.Whitespace +'i' Name.Other +';' Punctuation +'\n' Text.Whitespace + +'}' Punctuation +'\n' Text.Whitespace + +'\n' Text.Whitespace + +'fb' Name.Other +' ' Text.Whitespace +'QuickSort' Name.Other +'[' Punctuation +'T' Name.Other +':' Punctuation +' ' Text.Whitespace +'!' Punctuation +'Comparable' Name.Other +' ' Text.Whitespace +'&' Operator +' ' Text.Whitespace +'Movable' Name.Other +']' Punctuation +'(' Punctuation +'s' Name.Other +' ' Text.Whitespace +':' Punctuation +' ' Text.Whitespace +'Slice' Name.Other +'(' Punctuation +'T' Name.Other +')' Punctuation +')' Punctuation +' ' Text.Whitespace +'{' Punctuation +'\n' Text.Whitespace + +' ' Text.Whitespace +'if' Keyword +' ' Text.Whitespace +'(' Punctuation +'s' Name.Other +'.' Punctuation +'Size' Name.Other +'(' Punctuation +')' Punctuation +' ' Text.Whitespace +'<=' Operator +' ' Text.Whitespace +'1' Literal.Number.Integer +')' Punctuation +' ' Text.Whitespace +'{' Punctuation +'\n' Text.Whitespace + +' ' Text.Whitespace +'return' Keyword +';' Punctuation +'\n' Text.Whitespace + +' ' Text.Whitespace +'}' Punctuation +'\n' Text.Whitespace + +' ' Text.Whitespace +'let' Keyword.Declaration +' ' Text.Whitespace +'p' Name.Other +':' Punctuation +' ' Text.Whitespace +'i64' Keyword.Type +' ' Text.Whitespace +'=' Punctuation +' ' Text.Whitespace +'Partition' Name.Other +'(' Punctuation +'s' Name.Other +')' Punctuation +';' Punctuation +'\n' Text.Whitespace + +' ' Text.Whitespace +'QuickSort' Name.Other +'(' Punctuation +'s' Name.Other +'[' Punctuation +':' Punctuation +'p' Name.Other +' ' Text.Whitespace +'-' Operator +' ' Text.Whitespace +'1' Literal.Number.Integer +']' Punctuation +')' Punctuation +';' Punctuation +'\n' Text.Whitespace + +' ' Text.Whitespace +'QuickSort' Name.Other +'(' Punctuation +'s' Name.Other +'[' Punctuation +'p' Name.Other +' ' Text.Whitespace +'+' Operator +' ' Text.Whitespace +'1' Literal.Number.Integer +':' Punctuation +']' Punctuation +')' Punctuation +';' Punctuation +'\n' Text.Whitespace + +'}' Punctuation +'\n' Text.Whitespace |