| import sys | 
 | from pathlib import Path | 
 |  | 
 | CPYTHON_ROOT = Path(__file__).resolve().parent.parent.parent.parent | 
 | sys.path.append(str(CPYTHON_ROOT / "Parser")) | 
 |  | 
 | from pygments.lexer import RegexLexer, bygroups, include, words | 
 | from pygments.token import (Comment, Keyword, Name, Operator, | 
 |                             Punctuation, Text) | 
 |  | 
 | from asdl import builtin_types | 
 | from sphinx.highlighting import lexers | 
 |  | 
 | class ASDLLexer(RegexLexer): | 
 |     name = "ASDL" | 
 |     aliases = ["asdl"] | 
 |     filenames = ["*.asdl"] | 
 |     _name = r"([^\W\d]\w*)" | 
 |     _text_ws = r"(\s*)" | 
 |  | 
 |     tokens = { | 
 |         "ws": [ | 
 |             (r"\n", Text), | 
 |             (r"\s+", Text), | 
 |             (r"--.*?$", Comment.Singleline), | 
 |         ], | 
 |         "root": [ | 
 |             include("ws"), | 
 |             ( | 
 |                 r"(module)" + _text_ws + _name, | 
 |                 bygroups(Keyword, Text, Name.Tag), | 
 |             ), | 
 |             ( | 
 |                 r"(\w+)(\*\s|\?\s|\s)(\w+)", | 
 |                 bygroups(Name.Builtin.Pseudo, Operator, Name), | 
 |             ), | 
 |             (words(builtin_types), Name.Builtin), | 
 |             (r"attributes", Name.Builtin), | 
 |             ( | 
 |                 _name + _text_ws + "(=)", | 
 |                 bygroups(Name, Text, Operator), | 
 |             ), | 
 |             (_name, Name.Class), | 
 |             (r"\|", Operator), | 
 |             (r"{|}|\(|\)", Punctuation), | 
 |             (r".", Text), | 
 |         ], | 
 |     } | 
 |  | 
 |  | 
 | def setup(app): | 
 |     lexers["asdl"] = ASDLLexer() | 
 |     return {'version': '1.0', 'parallel_read_safe': True} |