{ "info": { "author": "tdkihrr", "author_email": "huanghezhao@outlook.com", "bugtrack_url": null, "classifiers": [], "description": "# Arcee\n\n[![Build Status](https://travis-ci.com/tdkihrr/arcee.svg?branch=master)](https://travis-ci.com/tdkihrr/arcee)\n\nIt is a Python parser generator, use EBNF-like syntax.\n\n## Install\n\n```bash\n$ pip install Arcee\n```\n\n## Example\n\nIt's really readable. \n\ngrammar:\n\n```\nKEYWORDS : let, if, zero, -\nNUMBER : \\d+(\\.\\d*)?\nASSIGN : =\nSUBTRACTION : -\nRIGHT_BRACKET : (\nCOLON : ,\nLETF_BRACKET : )\nID : [A-Za-z]+\nSKIP : [ \\\\t]+\n\nprogram : expression ;\nexpression : zeroexp\n | diffexp\n | ifexp\n | varexp\n | letexp\n | constexp\n ;\nconstexp : $NUMBER ;\ndiffexp : '-' '(' expression ',' expression ')' ;\nzeroexp : 'zero' '(' expression ')' ;\nifexp : 'if' expression 'then' expression 'else' expression ;\nvarexp : $ID ;\nletexp : 'let' $ID '=' expression 'in' expression ;\n```\n\n```\n$ arcee grammar > result.py\n```\n\n`result.py` has three parts:\n\n### Token\n\n```python\nfrom collections import namedtuple\n\nToken = namedtuple('Token', ['type', 'value', 'line', 'column'])\nProgram = namedtuple('Program', ['expression'])\n# ...\n```\n\n### Lexer\n\n```python\nimport re\n\ndef tokenize(code):\n pass # ...\n```\n\n### Parser\n\n```python\nclass Parser:\n def __init__(self, token_list):\n pass\n\n # ... \n\n def parse_expression(self):\n if xxx:\n self.parse_constexp()\n elif yyy:\n self.parse_diffexp()\n #...\n\n def parse_constexp(self):\n pass\n\n def parse_diffexp(self):\n pass\n\n def parse_zeroexp(self):\n pass\n\n def parse_ifexp(self):\n pass\n\n def parse_varexp(self):\n pass\n\n def parse_letexp(self):\n pass\n```\n\nYou can parse input such as:\n\n```python\ninput = '''let a = 0 in if zero(a) then -(a, 1) else -(a, 2)'''\n\ntokens = list(tokenize(input))\n\nparser = Parser(tokens)\n\nparser.parse_program()\n```\n\nresult is:\n\n```python\nresult = Program(\n expression=Expression(\n nonterminal=Letexp(\n ID=Token(type='ID', value='a', line=2, column=4),\n expression1=Expression(\n nonterminal=Constexp(\n NUMBER=Token(type='NUMBER', value='0', line=2, column=8))),\n expression2=Expression(\n nonterminal=Ifexp(\n expression1=Expression(\n nonterminal=Zeroexp(\n expression=Expression(\n nonterminal=Varexp(\n ID=Token(type='ID', value='a', line=2, column=21))))),\n expression2=Expression(\n nonterminal=Diffexp(\n expression1=Expression(\n nonterminal=Varexp(\n ID=Token(type='ID', value='a', line=2, column=31))),\n expression2=Expression(\n nonterminal=Constexp(\n NUMBER=Token(type='NUMBER', value='1', line=2,\n column=34))))),\n expression3=Expression(\n nonterminal=Diffexp(\n expression1=Expression(\n nonterminal=Varexp(\n ID=Token(type='ID', value='a', line=2, column=44))),\n expression2=Expression(\n nonterminal=Constexp(\n NUMBER=Token(type='NUMBER', value='2', line=2,\n column=47))))))))))\n```\n\nNow, you can use this ast to do what you like.\n\nYou can also use api in your Python file.\n\n```python\nfrom arcee import generate\n\ngrammar = '''KEYWORDS : let, if, zero, -\nNUMBER : \\d+(\\.\\d*)?\nASSIGN : =\nSUBTRACTION : -\nRIGHT_BRACKET : (\nCOLON : ,\nLETF_BRACKET : )\nID : [A-Za-z]+\nSKIP : [ \\\\t]+\n\nprogram : expression ;\nexpression : zeroexp\n | diffexp\n | ifexp\n | varexp\n | letexp\n | constexp\n ;\nconstexp : $NUMBER ;\ndiffexp : '-' '(' expression ',' expression ')' ;\nzeroexp : 'zero' '(' expression ')' ;\nifexp : 'if' expression 'then' expression 'else' expression ;\nvarexp : $ID ;\nletexp : 'let' $ID '=' expression 'in' expression ;'''\n\nprint(generate(grammar))\n```\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/tdkihrr/arcee", "keywords": "parser-generator", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "arcee", "package_url": "https://pypi.org/project/arcee/", "platform": "any", "project_url": "https://pypi.org/project/arcee/", "project_urls": { "Homepage": "https://github.com/tdkihrr/arcee" }, "release_url": "https://pypi.org/project/arcee/0.1.1/", "requires_dist": null, "requires_python": ">=3.4.0", "summary": "LL(1) parser generator", "version": "0.1.1" }, "last_serial": 4240251, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "892c22bae60286bd506e8c9c8cb3a95f", "sha256": "8b2b3e82bd28f1e29fe52b990dbc4f3bf8714b4a70a15b5d5e5430468a3db318" }, "downloads": -1, "filename": "arcee-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "892c22bae60286bd506e8c9c8cb3a95f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4.0", "size": 14000, "upload_time": "2018-09-02T03:30:06", "url": "https://files.pythonhosted.org/packages/22/8a/e27fb9c0914f7a2561fe610a98db8e834f28da6b461881ab934914d22bcd/arcee-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2973727f113b45db7d9827ffb1d7bf2f", "sha256": "98ae03d685bd277acbf2d8a1fcdb4c6210e1a377fdc6d05d5fb4d83278733fb1" }, "downloads": -1, "filename": "arcee-0.1.0.tar.gz", "has_sig": false, "md5_digest": "2973727f113b45db7d9827ffb1d7bf2f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 8562, "upload_time": "2018-09-02T03:30:08", "url": "https://files.pythonhosted.org/packages/d6/0b/c2f46d0501831a39fe65adb44e84b53565e26d4b81d0e1e380f1835f4a8b/arcee-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "2bbd60885902e2452c8d612ec1d0bdc7", "sha256": "7146b1c5ad723183b4bddca5c62b6e96d6784703d0b5b5a6994d704a383d8d7b" }, "downloads": -1, "filename": "arcee-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2bbd60885902e2452c8d612ec1d0bdc7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4.0", "size": 14081, "upload_time": "2018-09-05T08:31:58", "url": "https://files.pythonhosted.org/packages/41/15/ec6a216378600e397eec0e6c703fdfc8014f41960c8e326f8be621fa6cfb/arcee-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cd5a309f2208dd5f9f247e469865dbf1", "sha256": "f7703eac60d50426f369bc89e8c612c153b2962f15e8482784ba07f03b557e56" }, "downloads": -1, "filename": "arcee-0.1.1.tar.gz", "has_sig": false, "md5_digest": "cd5a309f2208dd5f9f247e469865dbf1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 8685, "upload_time": "2018-09-05T08:32:00", "url": "https://files.pythonhosted.org/packages/11/93/61bd2b1c2c0731ab52db9782dc2175e35d587a5a9862133649b4c9f08bc0/arcee-0.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "2bbd60885902e2452c8d612ec1d0bdc7", "sha256": "7146b1c5ad723183b4bddca5c62b6e96d6784703d0b5b5a6994d704a383d8d7b" }, "downloads": -1, "filename": "arcee-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2bbd60885902e2452c8d612ec1d0bdc7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4.0", "size": 14081, "upload_time": "2018-09-05T08:31:58", "url": "https://files.pythonhosted.org/packages/41/15/ec6a216378600e397eec0e6c703fdfc8014f41960c8e326f8be621fa6cfb/arcee-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cd5a309f2208dd5f9f247e469865dbf1", "sha256": "f7703eac60d50426f369bc89e8c612c153b2962f15e8482784ba07f03b557e56" }, "downloads": -1, "filename": "arcee-0.1.1.tar.gz", "has_sig": false, "md5_digest": "cd5a309f2208dd5f9f247e469865dbf1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4.0", "size": 8685, "upload_time": "2018-09-05T08:32:00", "url": "https://files.pythonhosted.org/packages/11/93/61bd2b1c2c0731ab52db9782dc2175e35d587a5a9862133649b4c9f08bc0/arcee-0.1.1.tar.gz" } ] }