Cours/venv/lib/python3.12/site-packages/pygments/lexers/elpi.py

173 lines
6.4 KiB
Python
Raw Normal View History

2024-09-02 16:55:06 +00:00
"""
pygments.lexers.elpi
~~~~~~~~~~~~~~~~~~~~
Lexer for the `Elpi <http://github.com/LPCIC/elpi>`_ programming language.
:copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
from pygments.lexer import RegexLexer, bygroups, include
from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
Number, Punctuation
__all__ = ['ElpiLexer']
class ElpiLexer(RegexLexer):
"""
Lexer for the Elpi programming language.
"""
name = 'Elpi'
url = 'http://github.com/LPCIC/elpi'
aliases = ['elpi']
filenames = ['*.elpi']
mimetypes = ['text/x-elpi']
version_added = '2.11'
lcase_re = r"[a-z]"
ucase_re = r"[A-Z]"
digit_re = r"[0-9]"
schar2_re = r"([+*^?/<>`'@#~=&!])"
schar_re = rf"({schar2_re}|-|\$|_)"
idchar_re = rf"({lcase_re}|{ucase_re}|{digit_re}|{schar_re})"
idcharstarns_re = rf"({idchar_re}*(\.({lcase_re}|{ucase_re}){idchar_re}*)*)"
symbchar_re = rf"({lcase_re}|{ucase_re}|{digit_re}|{schar_re}|:)"
constant_re = rf"({ucase_re}{idchar_re}*|{lcase_re}{idcharstarns_re}|{schar2_re}{symbchar_re}*|_{idchar_re}+)"
symbol_re = r"(,|<=>|->|:-|;|\?-|->|&|=>|\bas\b|\buvar\b|<|=<|=|==|>=|>|\bi<|\bi=<|\bi>=|\bi>|\bis\b|\br<|\br=<|\br>=|\br>|\bs<|\bs=<|\bs>=|\bs>|@|::|\[\]|`->|`:|`:=|\^|-|\+|\bi-|\bi\+|r-|r\+|/|\*|\bdiv\b|\bi\*|\bmod\b|\br\*|~|\bi~|\br~)"
escape_re = rf"\(({constant_re}|{symbol_re})\)"
const_sym_re = rf"({constant_re}|{symbol_re}|{escape_re})"
tokens = {
'root': [
include('elpi')
],
'elpi': [
include('_elpi-comment'),
(r"(:before|:after|:if|:name)(\s*)(\")",
bygroups(Keyword.Mode, Text.Whitespace, String.Double),
'elpi-string'),
(r"(:index)(\s*\()", bygroups(Keyword.Mode, Text.Whitespace),
'elpi-indexing-expr'),
(rf"\b(external pred|pred)(\s+)({const_sym_re})",
bygroups(Keyword.Declaration, Text.Whitespace, Name.Function),
'elpi-pred-item'),
(rf"\b(external type|type)(\s+)(({const_sym_re}(,\s*)?)+)",
bygroups(Keyword.Declaration, Text.Whitespace, Name.Function),
'elpi-type'),
(rf"\b(kind)(\s+)(({const_sym_re}|,)+)",
bygroups(Keyword.Declaration, Text.Whitespace, Name.Function),
'elpi-type'),
(rf"\b(typeabbrev)(\s+)({const_sym_re})",
bygroups(Keyword.Declaration, Text.Whitespace, Name.Function),
'elpi-type'),
(r"\b(accumulate)(\s+)(\")",
bygroups(Keyword.Declaration, Text.Whitespace, String.Double),
'elpi-string'),
(rf"\b(accumulate|namespace|local)(\s+)({constant_re})",
bygroups(Keyword.Declaration, Text.Whitespace, Text)),
(rf"\b(shorten)(\s+)({constant_re}\.)",
bygroups(Keyword.Declaration, Text.Whitespace, Text)),
(r"\b(pi|sigma)(\s+)([a-zA-Z][A-Za-z0-9_ ]*)(\\)",
bygroups(Keyword.Declaration, Text.Whitespace, Name.Variable, Text)),
(rf"\b(constraint)(\s+)(({const_sym_re}(\s+)?)+)",
bygroups(Keyword.Declaration, Text.Whitespace, Name.Function),
'elpi-chr-rule-start'),
(rf"(?=[A-Z_]){constant_re}", Name.Variable),
(rf"(?=[a-z_]){constant_re}\\", Name.Variable),
(r"_", Name.Variable),
(rf"({symbol_re}|!|=>|;)", Keyword.Declaration),
(constant_re, Text),
(r"\[|\]|\||=>", Keyword.Declaration),
(r'"', String.Double, 'elpi-string'),
(r'`', String.Double, 'elpi-btick'),
(r'\'', String.Double, 'elpi-tick'),
(r'\{\{', Punctuation, 'elpi-quote'),
(r'\{[^\{]', Text, 'elpi-spill'),
(r"\(", Text, 'elpi-in-parens'),
(r'\d[\d_]*', Number.Integer),
(r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float),
(r"[\+\*\-/\^\.]", Operator),
],
'_elpi-comment': [
(r'%[^\n]*\n', Comment),
(r'/\*', Comment, 'elpi-multiline-comment'),
(r"\s+", Text.Whitespace),
],
'elpi-multiline-comment': [
(r'\*/', Comment, '#pop'),
(r'.', Comment)
],
'elpi-indexing-expr':[
(r'[0-9 _]+', Number.Integer),
(r'\)', Text, '#pop'),
],
'elpi-type': [
(r"(ctype\s+)(\")", bygroups(Keyword.Type, String.Double), 'elpi-string'),
(r'->', Keyword.Type),
(constant_re, Keyword.Type),
(r"\(|\)", Keyword.Type),
(r"\.", Text, '#pop'),
include('_elpi-comment'),
],
'elpi-chr-rule-start': [
(r"\{", Text, 'elpi-chr-rule'),
include('_elpi-comment'),
],
'elpi-chr-rule': [
(r"\brule\b", Keyword.Declaration),
(r"\\", Keyword.Declaration),
(r"\}", Text, '#pop:2'),
include('elpi'),
],
'elpi-pred-item': [
(r"[io]:", Keyword.Mode, 'elpi-ctype'),
(r"\.", Text, '#pop'),
include('_elpi-comment'),
],
'elpi-ctype': [
(r"(ctype\s+)(\")", bygroups(Keyword.Type, String.Double), 'elpi-string'),
(r'->', Keyword.Type),
(constant_re, Keyword.Type),
(r"\(|\)", Keyword.Type),
(r",", Text, '#pop'),
(r"\.", Text, '#pop:2'),
include('_elpi-comment'),
],
'elpi-btick': [
(r'[^` ]+', String.Double),
(r'`', String.Double, '#pop'),
],
'elpi-tick': [
(r'[^\' ]+', String.Double),
(r'\'', String.Double, '#pop'),
],
'elpi-string': [
(r'[^\"]+', String.Double),
(r'"', String.Double, '#pop'),
],
'elpi-quote': [
(r'\{\{', Punctuation, '#push'),
(r'\}\}', Punctuation, '#pop'),
(rf"(lp:)((?=[A-Z_]){constant_re})", bygroups(Keyword, Name.Variable)),
(r"[^l\}]+", Text),
(r"l|\}", Text),
],
'elpi-spill': [
(r'\{[^\{]', Text, '#push'),
(r'\}[^\}]', Text, '#pop'),
include('elpi'),
],
'elpi-in-parens': [
(r"\(", Operator, '#push'),
(r"\)", Operator, '#pop'),
include('elpi'),
],
}