summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--python-rply.spec229
-rw-r--r--sources1
3 files changed, 231 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..020d24b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/rply-0.7.8.tar.gz
diff --git a/python-rply.spec b/python-rply.spec
new file mode 100644
index 0000000..879fdda
--- /dev/null
+++ b/python-rply.spec
@@ -0,0 +1,229 @@
+%global _empty_manifest_terminate_build 0
+Name: python-rply
+Version: 0.7.8
+Release: 1
+Summary: A pure Python Lex/Yacc that works with RPython
+License: BSD 3-Clause License
+URL: https://pypi.org/project/rply/
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/29/44/96b3e8e6426b1f21f90d73cff83a6df94ef8a57ce8102db6c582d0cb3b2e/rply-0.7.8.tar.gz
+BuildArch: noarch
+
+Requires: python3-appdirs
+
+%description
+Welcome to RPLY! A pure Python parser generator, that also works with RPython.
+It is a more-or-less direct port of David Beazley's awesome PLY, with a new
+public API, and RPython support.
+You can find the documentation `online`_.
+Basic API:
+ from rply import ParserGenerator, LexerGenerator
+ from rply.token import BaseBox
+ lg = LexerGenerator()
+ # Add takes a rule name, and a regular expression that defines the rule.
+ lg.add("PLUS", r"\+")
+ lg.add("MINUS", r"-")
+ lg.add("NUMBER", r"\d+")
+ lg.ignore(r"\s+")
+ # This is a list of the token names. precedence is an optional list of
+ # tuples which specifies order of operation for avoiding ambiguity.
+ # precedence must be one of "left", "right", "nonassoc".
+ # cache_id is an optional string which specifies an ID to use for
+ # caching. It should *always* be safe to use caching,
+ # RPly will automatically detect when your grammar is
+ # changed and refresh the cache for you.
+ pg = ParserGenerator(["NUMBER", "PLUS", "MINUS"],
+ precedence=[("left", ['PLUS', 'MINUS'])], cache_id="myparser")
+ @pg.production("main : expr")
+ def main(p):
+ # p is a list, of each of the pieces on the right hand side of the
+ # grammar rule
+ return p[0]
+ @pg.production("expr : expr PLUS expr")
+ @pg.production("expr : expr MINUS expr")
+ def expr_op(p):
+ lhs = p[0].getint()
+ rhs = p[2].getint()
+ if p[1].gettokentype() == "PLUS":
+ return BoxInt(lhs + rhs)
+ elif p[1].gettokentype() == "MINUS":
+ return BoxInt(lhs - rhs)
+ else:
+ raise AssertionError("This is impossible, abort the time machine!")
+ @pg.production("expr : NUMBER")
+ def expr_num(p):
+ return BoxInt(int(p[0].getstr()))
+ lexer = lg.build()
+ parser = pg.build()
+ class BoxInt(BaseBox):
+ def __init__(self, value):
+ self.value = value
+ def getint(self):
+ return self.value
+Then you can do:
+ parser.parse(lexer.lex("1 + 3 - 2+12-32"))
+You can also substitute your own lexer. A lexer is an object with a ``next()``
+method that returns either the next token in sequence, or ``None`` if the token
+stream has been exhausted.
+
+%package -n python3-rply
+Summary: A pure Python Lex/Yacc that works with RPython
+Provides: python-rply
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-rply
+Welcome to RPLY! A pure Python parser generator, that also works with RPython.
+It is a more-or-less direct port of David Beazley's awesome PLY, with a new
+public API, and RPython support.
+You can find the documentation `online`_.
+Basic API:
+ from rply import ParserGenerator, LexerGenerator
+ from rply.token import BaseBox
+ lg = LexerGenerator()
+ # Add takes a rule name, and a regular expression that defines the rule.
+ lg.add("PLUS", r"\+")
+ lg.add("MINUS", r"-")
+ lg.add("NUMBER", r"\d+")
+ lg.ignore(r"\s+")
+ # This is a list of the token names. precedence is an optional list of
+ # tuples which specifies order of operation for avoiding ambiguity.
+ # precedence must be one of "left", "right", "nonassoc".
+ # cache_id is an optional string which specifies an ID to use for
+ # caching. It should *always* be safe to use caching,
+ # RPly will automatically detect when your grammar is
+ # changed and refresh the cache for you.
+ pg = ParserGenerator(["NUMBER", "PLUS", "MINUS"],
+ precedence=[("left", ['PLUS', 'MINUS'])], cache_id="myparser")
+ @pg.production("main : expr")
+ def main(p):
+ # p is a list, of each of the pieces on the right hand side of the
+ # grammar rule
+ return p[0]
+ @pg.production("expr : expr PLUS expr")
+ @pg.production("expr : expr MINUS expr")
+ def expr_op(p):
+ lhs = p[0].getint()
+ rhs = p[2].getint()
+ if p[1].gettokentype() == "PLUS":
+ return BoxInt(lhs + rhs)
+ elif p[1].gettokentype() == "MINUS":
+ return BoxInt(lhs - rhs)
+ else:
+ raise AssertionError("This is impossible, abort the time machine!")
+ @pg.production("expr : NUMBER")
+ def expr_num(p):
+ return BoxInt(int(p[0].getstr()))
+ lexer = lg.build()
+ parser = pg.build()
+ class BoxInt(BaseBox):
+ def __init__(self, value):
+ self.value = value
+ def getint(self):
+ return self.value
+Then you can do:
+ parser.parse(lexer.lex("1 + 3 - 2+12-32"))
+You can also substitute your own lexer. A lexer is an object with a ``next()``
+method that returns either the next token in sequence, or ``None`` if the token
+stream has been exhausted.
+
+%package help
+Summary: Development documents and examples for rply
+Provides: python3-rply-doc
+%description help
+Welcome to RPLY! A pure Python parser generator, that also works with RPython.
+It is a more-or-less direct port of David Beazley's awesome PLY, with a new
+public API, and RPython support.
+You can find the documentation `online`_.
+Basic API:
+ from rply import ParserGenerator, LexerGenerator
+ from rply.token import BaseBox
+ lg = LexerGenerator()
+ # Add takes a rule name, and a regular expression that defines the rule.
+ lg.add("PLUS", r"\+")
+ lg.add("MINUS", r"-")
+ lg.add("NUMBER", r"\d+")
+ lg.ignore(r"\s+")
+ # This is a list of the token names. precedence is an optional list of
+ # tuples which specifies order of operation for avoiding ambiguity.
+ # precedence must be one of "left", "right", "nonassoc".
+ # cache_id is an optional string which specifies an ID to use for
+ # caching. It should *always* be safe to use caching,
+ # RPly will automatically detect when your grammar is
+ # changed and refresh the cache for you.
+ pg = ParserGenerator(["NUMBER", "PLUS", "MINUS"],
+ precedence=[("left", ['PLUS', 'MINUS'])], cache_id="myparser")
+ @pg.production("main : expr")
+ def main(p):
+ # p is a list, of each of the pieces on the right hand side of the
+ # grammar rule
+ return p[0]
+ @pg.production("expr : expr PLUS expr")
+ @pg.production("expr : expr MINUS expr")
+ def expr_op(p):
+ lhs = p[0].getint()
+ rhs = p[2].getint()
+ if p[1].gettokentype() == "PLUS":
+ return BoxInt(lhs + rhs)
+ elif p[1].gettokentype() == "MINUS":
+ return BoxInt(lhs - rhs)
+ else:
+ raise AssertionError("This is impossible, abort the time machine!")
+ @pg.production("expr : NUMBER")
+ def expr_num(p):
+ return BoxInt(int(p[0].getstr()))
+ lexer = lg.build()
+ parser = pg.build()
+ class BoxInt(BaseBox):
+ def __init__(self, value):
+ self.value = value
+ def getint(self):
+ return self.value
+Then you can do:
+ parser.parse(lexer.lex("1 + 3 - 2+12-32"))
+You can also substitute your own lexer. A lexer is an object with a ``next()``
+method that returns either the next token in sequence, or ``None`` if the token
+stream has been exhausted.
+
+%prep
+%autosetup -n rply-0.7.8
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-rply -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Thu Mar 09 2023 Python_Bot <Python_Bot@openeuler.org> - 0.7.8-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..55b1642
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+200930c68316dff60ff2658c770d9084 rply-0.7.8.tar.gz