summaryrefslogtreecommitdiffstats
path: root/Doc
diff options
context:
space:
mode:
authorBatuhan Taskaya <batuhanosmantaskaya@gmail.com>2020-05-06 05:24:39 (GMT)
committerGitHub <noreply@github.com>2020-05-06 05:24:39 (GMT)
commitd60040ba226bd2e3b6f58d074015aa2499dc1cb8 (patch)
tree65febdcf90469f484c76bc4cf4164cde10959672 /Doc
parentb9c46a2c2d7fc68457bff641f78932d66f5e5f59 (diff)
downloadcpython-d60040ba226bd2e3b6f58d074015aa2499dc1cb8.zip
cpython-d60040ba226bd2e3b6f58d074015aa2499dc1cb8.tar.gz
cpython-d60040ba226bd2e3b6f58d074015aa2499dc1cb8.tar.bz2
bpo-40517: Implement syntax highlighting support for ASDL (#19928)
Diffstat (limited to 'Doc')
-rw-r--r--Doc/conf.py3
-rw-r--r--Doc/library/ast.rst2
-rw-r--r--Doc/tools/extensions/asdl_highlight.py51
3 files changed, 54 insertions, 2 deletions
diff --git a/Doc/conf.py b/Doc/conf.py
index 32db343..12d74ea 100644
--- a/Doc/conf.py
+++ b/Doc/conf.py
@@ -14,7 +14,8 @@ sys.path.append(os.path.abspath('includes'))
# ---------------------
extensions = ['sphinx.ext.coverage', 'sphinx.ext.doctest',
- 'pyspecific', 'c_annotations', 'escape4chm']
+ 'pyspecific', 'c_annotations', 'escape4chm',
+ 'asdl_highlight']
doctest_global_setup = '''
diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst
index fc04114..6c6ad01 100644
--- a/Doc/library/ast.rst
+++ b/Doc/library/ast.rst
@@ -35,7 +35,7 @@ Abstract Grammar
The abstract grammar is currently defined as follows:
.. literalinclude:: ../../Parser/Python.asdl
- :language: none
+ :language: asdl
Node classes
diff --git a/Doc/tools/extensions/asdl_highlight.py b/Doc/tools/extensions/asdl_highlight.py
new file mode 100644
index 0000000..9b003e9
--- /dev/null
+++ b/Doc/tools/extensions/asdl_highlight.py
@@ -0,0 +1,51 @@
+import os
+import sys
+sys.path.append(os.path.abspath("../Parser/"))
+
+from pygments.lexer import RegexLexer, bygroups, include, words
+from pygments.token import (Comment, Generic, 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.Class),
+ ),
+ (
+ r"(\w+)(\*\s|\?\s|\s)(\w+)",
+ bygroups(Name.Variable, Generic.Strong, Name.Tag),
+ ),
+ (words(builtin_types), Keyword.Type),
+ (r"attributes", Name.Builtin),
+ (
+ _name + _text_ws + "(=)",
+ bygroups(Name.Variable, Text, Operator),
+ ),
+ (_name, Name.Function),
+ (r"\|", Operator),
+ (r"{|}|\(|\)", Punctuation),
+ (r".", Text),
+ ],
+ }
+
+
+def setup(app):
+ lexers["asdl"] = ASDLLexer()
+ return {'version': '1.0', 'parallel_read_safe': True}