diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | python-rply.spec | 229 | ||||
-rw-r--r-- | sources | 1 |
3 files changed, 231 insertions, 0 deletions
@@ -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 @@ -0,0 +1 @@ +200930c68316dff60ff2658c770d9084 rply-0.7.8.tar.gz |