|
""" |
|
pygments.lexers.asn1 |
|
~~~~~~~~~~~~~~~~~~~~ |
|
|
|
Pygments lexers for ASN.1. |
|
|
|
:copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. |
|
:license: BSD, see LICENSE for details. |
|
""" |
|
|
|
import re |
|
|
|
from pygments.token import Comment, Operator, Keyword, Name, String, \ |
|
Number, Punctuation, Whitespace |
|
from pygments.lexer import RegexLexer, words, bygroups |
|
|
|
__all__ = ['Asn1Lexer'] |
|
|
|
SINGLE_WORD_KEYWORDS = [ |
|
"ENCODED", |
|
"ABSTRACT-SYNTAX", |
|
"END", |
|
"APPLICATION", |
|
"EXPLICIT", |
|
"IMPLICIT", |
|
"AUTOMATIC", |
|
"TAGS", |
|
"BEGIN", |
|
"EXTENSIBILITY", |
|
"BY", |
|
"FROM", |
|
"COMPONENT", |
|
"UNIVERSAL", |
|
"COMPONENTS", |
|
"CONSTRAINED", |
|
"IMPLIED", |
|
"DEFINITIONS", |
|
"INCLUDES", |
|
"PRIVATE", |
|
"WITH", |
|
"OF", |
|
] |
|
|
|
OPERATOR_WORDS = [ |
|
"EXCEPT", |
|
"UNION", |
|
"INTERSECTION", |
|
] |
|
|
|
SINGLE_WORD_NAMESPACE_KEYWORDS = [ |
|
"EXPORTS", |
|
"IMPORTS", |
|
] |
|
|
|
MULTI_WORDS_DECLARATIONS = [ |
|
"SEQUENCE OF", |
|
"SET OF", |
|
"INSTANCE OF", |
|
"WITH SYNTAX", |
|
] |
|
|
|
SINGLE_WORDS_DECLARATIONS = [ |
|
"SIZE", |
|
"SEQUENCE", |
|
"SET", |
|
"CLASS", |
|
"UNIQUE", |
|
"DEFAULT", |
|
"CHOICE", |
|
"PATTERN", |
|
"OPTIONAL", |
|
"PRESENT", |
|
"ABSENT", |
|
"CONTAINING", |
|
"ENUMERATED", |
|
"ALL", |
|
] |
|
|
|
TWO_WORDS_TYPES = [ |
|
"OBJECT IDENTIFIER", |
|
"BIT STRING", |
|
"OCTET STRING", |
|
"CHARACTER STRING", |
|
"EMBEDDED PDV", |
|
] |
|
|
|
SINGLE_WORD_TYPES = [ |
|
"RELATIVE-OID", |
|
"TYPE-IDENTIFIER", |
|
"ObjectDescriptor", |
|
"IA5String", |
|
"INTEGER", |
|
"ISO646String", |
|
"T61String", |
|
"BMPString", |
|
"NumericString", |
|
"TeletexString", |
|
"GeneralizedTime", |
|
"REAL", |
|
"BOOLEAN", |
|
"GeneralString", |
|
"GraphicString", |
|
"UniversalString", |
|
"UTCTime", |
|
"VisibleString", |
|
"UTF8String", |
|
"PrintableString", |
|
"VideotexString", |
|
"EXTERNAL", |
|
] |
|
|
|
|
|
def word_sequences(tokens): |
|
return "(" + '|'.join(token.replace(' ', r'\s+') for token in tokens) + r')\b' |
|
|
|
|
|
class Asn1Lexer(RegexLexer): |
|
|
|
""" |
|
Lexer for ASN.1 module definition |
|
""" |
|
|
|
flags = re.MULTILINE |
|
|
|
name = 'ASN.1' |
|
aliases = ['asn1'] |
|
filenames = ["*.asn1"] |
|
url = "https://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf" |
|
version_added = '2.16' |
|
|
|
tokens = { |
|
'root': [ |
|
|
|
(r'\s+', Whitespace), |
|
|
|
(r'--.*$', Comment.Single), |
|
(r'/\*', Comment.Multiline, 'comment'), |
|
|
|
(r'\d+\.\d*([eE][-+]?\d+)?', Number.Float), |
|
(r'\d+', Number.Integer), |
|
|
|
(r"&?[a-z][-a-zA-Z0-9]*[a-zA-Z0-9]\b", Name.Variable), |
|
|
|
(words(("TRUE", "FALSE", "NULL", "MINUS-INFINITY", "PLUS-INFINITY", "MIN", "MAX"), suffix=r'\b'), Keyword.Constant), |
|
|
|
(word_sequences(TWO_WORDS_TYPES), Keyword.Type), |
|
(words(SINGLE_WORD_TYPES, suffix=r'\b'), Keyword.Type), |
|
|
|
(r"EXPORTS\s+ALL\b", Keyword.Namespace), |
|
(words(SINGLE_WORD_NAMESPACE_KEYWORDS, suffix=r'\b'), Operator.Namespace), |
|
(word_sequences(MULTI_WORDS_DECLARATIONS), Keyword.Declaration), |
|
(words(SINGLE_WORDS_DECLARATIONS, suffix=r'\b'), Keyword.Declaration), |
|
(words(OPERATOR_WORDS, suffix=r'\b'), Operator.Word), |
|
(words(SINGLE_WORD_KEYWORDS), Keyword), |
|
|
|
(r"&?[A-Z][-a-zA-Z0-9]*[a-zA-Z0-9]\b", Name.Type), |
|
|
|
(r"(::=|\.\.\.|\.\.|\[\[|\]\]|\||\^)", Operator), |
|
|
|
(r"(\.|,|\{|\}|\(|\)|\[|\])", Punctuation), |
|
|
|
(r'"', String, 'string'), |
|
|
|
(r"('[01 ]*')(B)\b", bygroups(String, String.Affix)), |
|
(r"('[0-9A-F ]*')(H)\b",bygroups(String, String.Affix)), |
|
], |
|
'comment': [ |
|
(r'[^*/]+', Comment.Multiline), |
|
(r'/\*', Comment.Multiline, '#push'), |
|
(r'\*/', Comment.Multiline, '#pop'), |
|
(r'[*/]', Comment.Multiline) |
|
], |
|
'string': [ |
|
(r'""', String), |
|
(r'"', String, "#pop"), |
|
(r'[^"]', String), |
|
] |
|
} |
|
|