Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for Carbon Programming Language #2362

Merged
merged 4 commits into from Mar 1, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions AUTHORS
Expand Up @@ -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!
1 change: 1 addition & 0 deletions pygments/lexers/_mapping.py
Expand Up @@ -71,6 +71,7 @@
'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',)),
Expand Down
69 changes: 69 additions & 0 deletions pygments/lexers/carbon.py
@@ -0,0 +1,69 @@
"""
pygments.lexers.carbon
~~~~~~~~~~~~~~~~~~~~~

Lexers for the Carbon programming language.

:copyright: Copyright 2006-2023 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:: 0.0
AmrDeveloper marked this conversation as resolved.
Show resolved Hide resolved
"""
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
(r'(as|or|not|and|break|continue|case|default|'
r'if|else|destructor|for|forall|while|where|then|'
r'in|is|return|returned)\b', Keyword),
AmrDeveloper marked this conversation as resolved.
Show resolved Hide resolved
(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'0[b][01]+[sl]?', Number.Bin),
(r'0[o][0-7]+[sl]?', Number.Oct),
(r'[0-9]+', Number.Integer),
# string literal
(r'"(\\\\|\\[^\\]|[^"\\])*"', String),
AmrDeveloper marked this conversation as resolved.
Show resolved Hide resolved
# char literal
(r'\'(\\\\|\\[^\\]|[^\'\\])\'', String.Char),
# tokens
(r'<<=|>>=|<<|>>|<=|>=|\+=|-=|\*=|/=|\%=|\|=|&=|\^=|&&|\|\||&|\||'
r'\+\+|--|\%|\^|\~|==|!=|::|[.]{3}|[+\-*/&]|->|=>', Operator),
(r'[|<>=!()\[\]{}.,;:\?]', Punctuation),
# identifiers
(r'[^\W\d]\w*', Name.Other),
]
}
19 changes: 19 additions & 0 deletions 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:]);
}
219 changes: 219 additions & 0 deletions tests/examplefiles/carbon/example.carbon.output

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.