176 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Python
		
	
	
	
"""
 | 
						|
    pygments.lexers.elpi
 | 
						|
    ~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
    Lexer for the `Elpi <http://github.com/LPCIC/elpi>`_ programming language.
 | 
						|
 | 
						|
    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
 | 
						|
    :license: BSD, see LICENSE for details.
 | 
						|
"""
 | 
						|
 | 
						|
from pygments.lexer import RegexLexer, bygroups, include, using
 | 
						|
from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
 | 
						|
    Number, Punctuation
 | 
						|
 | 
						|
__all__ = ['ElpiLexer']
 | 
						|
 | 
						|
from pygments.lexers.theorem import CoqLexer
 | 
						|
 | 
						|
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, Punctuation),
 | 
						|
             '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(typeabbrev)(\s+)(\([^)]+\))",
 | 
						|
             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"\(", Punctuation, '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'/(?:\\\n)?[*](?:[^*]|[*](?!(?:\\\n)?/))*[*](?:\\\n)?/', Comment),
 | 
						|
            (r"\s+", Text.Whitespace),
 | 
						|
        ],
 | 
						|
        'elpi-indexing-expr':[
 | 
						|
            (r'[0-9 _]+', Number.Integer),
 | 
						|
            (r'\)', Punctuation, '#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"\{", Punctuation, 'elpi-chr-rule'),
 | 
						|
            include('_elpi-comment'),
 | 
						|
        ],
 | 
						|
        'elpi-chr-rule': [
 | 
						|
           (r"\brule\b", Keyword.Declaration),
 | 
						|
           (r"\\", Keyword.Declaration),
 | 
						|
           (r"\}", Punctuation, '#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, '#pop'),
 | 
						|
            (r"\s+", Text.Whitespace),
 | 
						|
            (r"(lp:)(\{\{)", bygroups(Number, Punctuation), 'elpi-quote-exit'),
 | 
						|
            (rf"(lp:)((?=[A-Z_]){constant_re})", bygroups(Number, Name.Variable)),
 | 
						|
            (r"((?!lp:|\}\}).)+", using(CoqLexer)),
 | 
						|
        ],
 | 
						|
        'elpi-quote-exit': [
 | 
						|
            include('elpi'),
 | 
						|
            (r'\}\}', Punctuation, '#pop'),
 | 
						|
        ],
 | 
						|
        'elpi-spill': [
 | 
						|
            (r'\{[^\{]', Text, '#push'),
 | 
						|
            (r'\}[^\}]', Text, '#pop'),
 | 
						|
            include('elpi'),
 | 
						|
        ],
 | 
						|
        'elpi-in-parens': [
 | 
						|
            (r"\(", Punctuation, '#push'),
 | 
						|
            include('elpi'),
 | 
						|
            (r"\)", Punctuation, '#pop'),
 | 
						|
        ],
 | 
						|
    }
 |