summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--pygments/lexers/_mapping.py1
-rw-r--r--pygments/lexers/carbon.py70
-rw-r--r--tests/examplefiles/carbon/example.carbon19
-rw-r--r--tests/examplefiles/carbon/example.carbon.output219
5 files changed, 310 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
index a0ed5b8d..876a37d7 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -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