python-pycparser: bump to 3.0
authorAlexandru Ardelean <redacted>
Mon, 23 Mar 2026 18:39:26 +0000 (18:39 +0000)
committerAlexandru Ardelean <redacted>
Wed, 25 Mar 2026 12:56:35 +0000 (14:56 +0200)
v3.0 removes the dependency on PLY by rewriting pycparser with a
hand-written lexer and recursive-descent parser for C. No API changes
or functionality changes - the same AST is produced as before.

Other changes:
- Drop EOL Python 3.8 and 3.9 support (minimum now 3.10)
- Add support for Python 3.14

Since PLY is no longer used:
- Remove python-ply from PKG_BUILD_DEPENDS and HOST_BUILD_DEPENDS
- Remove +python3-ply from package DEPENDS
- Remove 001-use-external-ply.patch (no longer needed)

Full release notes:
https://github.com/eliben/pycparser/releases/tag/release_v3.00

Co-Authored-By: Claude Sonnet 4.6 <redacted>
Signed-off-by: Alexandru Ardelean <redacted>
lang/python/python-pycparser/Makefile
lang/python/python-pycparser/patches/001-use-external-ply.patch [deleted file]
lang/python/python-pycparser/test.sh [new file with mode: 0755]

index 37f5699c6c4e041024b6dfa81c96b9ea5debb60d..f03c0440363ef85d9ac693566d4f3874e8b8265b 100644 (file)
@@ -8,11 +8,11 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=python-pycparser
-PKG_VERSION:=2.23
+PKG_VERSION:=3.0
 PKG_RELEASE:=1
 
 PYPI_NAME:=pycparser
-PKG_HASH:=78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2
+PKG_HASH:=600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29
 
 PKG_LICENSE:=BSD-3-Clause
 PKG_LICENSE_FILES:=LICENSE
@@ -20,15 +20,13 @@ PKG_MAINTAINER:=Alexandru Ardelean <ardeleanalex@gmail.com>
 
 PKG_BUILD_DEPENDS:= \
        python3/host \
-       python-setuptools/host \
-       python-ply/host  # ply==3.10
+       python-setuptools/host
 HOST_BUILD_DEPENDS:= \
        python3/host \
        python-setuptools/host \
        python-build/host \
        python-installer/host \
-       python-wheel/host \
-       python-ply/host
+       python-wheel/host
 
 include ../pypi.mk
 include $(INCLUDE_DIR)/package.mk
@@ -43,8 +41,7 @@ define Package/python3-pycparser
   TITLE:=C parser in Python
   URL:=https://github.com/eliben/pycparser
   DEPENDS:= \
-      +python3-light \
-      +python3-ply
+      +python3-light
 endef
 
 define Package/python3-pycparser/description
diff --git a/lang/python/python-pycparser/patches/001-use-external-ply.patch b/lang/python/python-pycparser/patches/001-use-external-ply.patch
deleted file mode 100644 (file)
index 0eb243f..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
---- a/pycparser/c_lexer.py
-+++ b/pycparser/c_lexer.py
-@@ -8,8 +8,8 @@
- #------------------------------------------------------------------------------
- import re
--from .ply import lex
--from .ply.lex import TOKEN
-+from ply import lex
-+from ply.lex import TOKEN
- class CLexer(object):
---- a/pycparser/c_parser.py
-+++ b/pycparser/c_parser.py
-@@ -6,7 +6,7 @@
- # Eli Bendersky [https://eli.thegreenplace.net/]
- # License: BSD
- #------------------------------------------------------------------------------
--from .ply import yacc
-+from ply import yacc
- from . import c_ast
- from .c_lexer import CLexer
---- a/setup.py
-+++ b/setup.py
-@@ -61,7 +61,7 @@ setup(
-         'Programming Language :: Python :: 3.13',
-     ],
-     python_requires=">=3.8",
--    packages=['pycparser', 'pycparser.ply'],
-+    packages=['pycparser'],
-     package_data={'pycparser': ['*.cfg']},
-     cmdclass={'install': install, 'sdist': sdist},
- )
diff --git a/lang/python/python-pycparser/test.sh b/lang/python/python-pycparser/test.sh
new file mode 100755 (executable)
index 0000000..ede0560
--- /dev/null
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+[ "$1" = "python3-pycparser" ] || exit 0
+
+python3 - << EOF
+import sys
+import pycparser
+
+# aardelean: yes, it's hardcoded here, hopefully we don't get too many;
+#            but for version 3.0 on pypi.org, pycparser reports 3.00
+if "3.0" == "$2" and pycparser.__version__ == "3.00":
+    pass
+elif pycparser.__version__ != "$2":
+    print("Wrong version: " + pycparser.__version__)
+    sys.exit(1)
+
+# Test basic parsing of a simple C snippet
+parser = pycparser.CParser()
+ast = parser.parse("int x = 5;", filename='<none>')
+assert ast is not None, "Failed to parse simple C code"
+
+# Verify the AST contains a FileAST node
+assert isinstance(ast, pycparser.c_ast.FileAST), \
+    f"Expected FileAST, got {type(ast)}"
+
+# Test parsing a function declaration
+ast2 = parser.parse("int foo(int a, int b) { return a + b; }", filename='<none>')
+assert ast2 is not None, "Failed to parse function declaration"
+
+sys.exit(0)
+EOF
git clone https://git.99rst.org/PROJECT