{ "info": { "author": "Julien Romero", "author_email": "romerojulien34@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# pyformlang\n\n[![Build Status](https://jenkins.r2.enst.fr/job/pyformlang/job/master/badge/icon)](https://jenkins.r2.enst.fr/job/pyformlang/job/master/)\n[![pypi](https://img.shields.io/pypi/v/pyformlang.svg)](https://pypi.org/project/pyformlang/)\n[![Documentation](https://readthedocs.org/projects/pyformlang/badge/?version=latest)](https://pyformlang.readthedocs.io/en/latest/)\n\nA python library to manipulate formal grammar. In general, it can be used to better understand algorithms in a formal way.\n\n## Installation\n\n```bash\npip3 install pyformlang\n```\n\n## Sources\n\nMost algorithms come from Introduction to *Automata Theory, Languages, and Computation*\n(2nd edition) by John E. Hopcroft, Rajeev Motwani and Jeferey D. Ullman.\n\nIndexed grammars come from the original paper *Index Grammars - An Extension of Context-free grammars* by Alfred V. Aho.\n\nOn the implementation of Hopcroft minimization algorithm: [Implementation of Hopcroft's Algorithm, Hang Zhou](https://www.irif.fr/~carton/Enseignement/Complexite/ENS/Redaction/2009-2010/hang.zhou.pdf)\n\n[Intersection CFG/Regex](https://www.degruyter.com/downloadpdf/j/stuf.1961.14.issue-1-4/stuf.1961.14.14.143/stuf.1961.14.14.143.pdf)\n\n## Usage\n\n### Regular expression\n\npyformlang contains a basic regex reader. The available operators are:\n\n* The concatenation, the default operator, which can by represented either by a\nspace or a dot (.)\n* The union, represented either by | or +\n* The kleene star, represented by *\n\nIt is also possible to use parenthesis. Symbols different from the space, ., |, +, \\*, (, ) and $ can be part of the alphabet, consecutive characters being consider as a single symbol. The epsilon symbol can either be *epsilon* or *$*.\n\n```python\nfrom pyformlang.regular_expression import Regex\n\nregex = Regex(\"(a-|a a b)*\")\n```\n\n### Finite Automata\n\npyformlang contains several finite automata, all of them being equivalent in the languages they can describe. In general, the states have to be represented by a *pyformlang.finite_automaton.State* object and the symbols by a *pyformlang.finite_automaton.Symbol*. When the class is not ambiguous, raw values can also be used. In addition, epsilon transitions are elements of the class: *pyformlang.finite_automaton.Epsilon*.\n\n#### Deterministic Automata\n\nThese represent deterministic automata, i.e. with only one possible next state possible at each stage and no epsilon transitions.\n\n``` python\nfrom pyformlang.finite_automaton import DeterministicFiniteAutomaton\nfrom pyformlang.finite_automaton import State\nfrom pyformlang.finite_automaton import Symbol\n\n# Declaration of the DFA\ndfa = DeterministicFiniteAutomaton()\n\n# Creation of the states\nstate0 = State(0)\nstate1 = State(1)\nstate2 = State(2)\nstate3 = State(3)\n\n# Creation of the symbols\nsymb_a = Symbol(\"a\")\nsymb_b = Symbol(\"b\")\nsymb_c = Symbol(\"c\")\nsymb_d = Symbol(\"d\")\n\n# Add a start state\ndfa.add_start_state(state0)\n\n# Add two final states\ndfa.add_final_state(state2)\ndfa.add_final_state(state3)\n\n# Create transitions\ndfa.add_transition(state0, symb_a, state1)\ndfa.add_transition(state1, symb_b, state1)\ndfa.add_transition(state1, symb_c, state2)\ndfa.add_transition(state1, symb_d, state3)\n\n# Check if a word is accepted\ndfa.accepts([symb_a, symb_b, symb_c])\n```\n\n#### Non Deterministic Automata\n\nThe representation of non deterministic automata, i.e. automata with possibly several next states at each stage but no epsilon transitions.\n\n``` python\nfrom pyformlang.finite_automaton import NondeterministicFiniteAutomaton\nfrom pyformlang.finite_automaton import State\nfrom pyformlang.finite_automaton import Symbol\n\n# Definition of the NFA\nnfa = NondeterministicFiniteAutomaton()\n\n# Declare the states\nstate0 = State(0)\nstate1 = State(1)\nstate2 = State(2)\nstate3 = State(3)\nstate4 = State(4)\n\n# Declare the symbols\nsymb_a = Symbol(\"a\")\nsymb_b = Symbol(\"b\")\nsymb_c = Symbol(\"c\")\nsymb_d = Symbol(\"d\")\n\n# Add a start state\nnfa.add_start_state(state0)\n# Add a final state\nnfa.add_final_state(state4)\nnfa.add_final_state(state3)\n# Add the transitions\nnfa.add_transition(state0, symb_a, state1)\nnfa.add_transition(state1, symb_b, state1)\nnfa.add_transition(state1, symb_c, state2)\nnfa.add_transition(state1, symb_d, state3)\nnfa.add_transition(state1, symb_c, state4)\nnfa.add_transition(state1, symb_b, state4)\n\n# Check if a word is accepted\nnfa.accepts([symb_a, symb_b, symb_c])\n\n# Check if a NFA is deterministic\nnfa.is_deterministic() # False\n\n# Get the equivalent deterministic automaton\ndfa = nfa.to_deterministic()\n```\n\n#### Epsilon Non Deterministic Automata\n\nIt represents a non deterministic automaton where epsilon transitions are allowed.\n\n``` python\nfrom pyformlang.finite_automaton import EpsilonNFA, State, Symbol, Epsilon\n\n# Declaration of the symbols and the states\nepsilon = Epsilon()\nplus = Symbol(\"+\")\nminus = Symbol(\"-\")\npoint = Symbol(\".\")\ndigits = [Symbol(x) for x in range(10)]\nstates = [State(\"q\" + str(x)) for x in range(6)]\n\n# Creattion of the Epsilon NFA\nenfa = EpsilonNFA()\nenfa.add_start_state(states[0])\nenfa.add_final_state(states[5])\nenfa.add_transition(states[0], epsilon, states[1])\nenfa.add_transition(states[0], plus, states[1])\nenfa.add_transition(states[0], minus, states[1])\nfor digit in digits:\n enfa.add_transition(states[1], digit, states[1])\n enfa.add_transition(states[1], digit, states[4])\n enfa.add_transition(states[2], digit, states[3])\n enfa.add_transition(states[3], digit, states[3])\nenfa.add_transition(states[1], point, states[2])\nenfa.add_transition(states[4], point, states[3])\nenfa.add_transition(states[3], epsilon, states[5])\n\n# Checks if a word is accepted\nenfa.accepts([plus, digits[1], point, digits[9]])\n```\n\n### Regex and Finite Automaton\n\nAs regex and finite automaton are equivalent, one can turn one into the other.\n\n```python\nfrom pyformlang.finite_automaton import EpsilonNFA, State, Symbol, Epsilon\n\nenfa = EpsilonNFA()\nstate0 = State(0)\nstate1 = State(1)\nsymb_a = Symbol(\"0\")\nsymb_b = Symbol(\"1\")\nenfa.add_start_state(state0)\nenfa.add_final_state(state1)\nenfa.add_transition(state0, symb_a, state0)\nenfa.add_transition(state1, symb_b, state0)\nenfa.add_transition(state1, symb_b, state1)\n\n# Turn a finite automaton into a regex...\nregex = enfa.to_regex()\n# And turn it back into an epsilon non deterministic automaton\nenfa2 = regex.to_epsilon_nfa()\n```\n\n### Context-Free Grammar\n\nWe represent here context-free grammars. Like finite automata, one needs to use the classes *pyformlang.cfg.Variable* and *pyformlang.cfg.Terminal* to represent variables and terminals. The productions need to be represented as *pyformlang.cfg.Production*. In addition, epsilon terminals are members of *pyformlang.cfg.Epsilon*.\n\n```python\nfrom pyformlang.cfg import Production, Variable, Terminal, CFG, Epsilon\n\n# Creation of variables\nvar_useless = Variable(\"USELESS\")\nvar_S = Variable(\"S\")\nvar_B = Variable(\"B\")\n\n# Creation of terminals\nter_a = Terminal(\"a\")\nter_b = Terminal(\"b\")\nter_c = Terminal(\"c\")\n\n# Creation of productions\np0 = Production(var_S, [ter_a, var_S, var_B])\np1 = Production(var_useless, [ter_a, var_S, var_B])\np2 = Production(var_S, [var_useless])\np4 = Production(var_B, [ter_b])\np5 = Production(var_useless, [])\n\n# Creation of the CFG\ncfg = CFG({var_useless, var_S}, {ter_a, ter_b}, var_S, {p0, p1, p2, p4, p5})\n\n# Check for containment\ncfg.contains([Epsilon()])\ncfg.contains([ter_a, ter_b])\n```\n\n### Push-Down Automata\n\nFor a Push-Down Automata, there are there objects: *pyformlang.pda.State* which represents a state, *pyformlang.pda.Symbol* which represents a symbol and *pyformlang.pda.StackSymbol* which represents a stack symbol.\n\nPDA can either accept by final state or by empty stack. Function are provided to transform one kind into the other.\n\n```python\nfrom pyformlang.pda import PDA, State, StackSymbol, Symbol, Epsilon\n\n# Declare states\nq = State(\"#STARTTOFINAL#\")\nq0 = State(\"q0\")\n\n# Declare symbols\ne = Symbol(\"e\")\ni = Symbol(\"i\")\n\n# Declare stack symbols\nZ = StackSymbol(\"Z\")\nZ0 = StackSymbol(\"Z0\")\n\n# Create the PDA\npda = PDA(states={q, q0},\n input_symbols={i, e},\n stack_alphabet={Z, Z0},\n start_state=q,\n start_stack_symbol=Z0,\n final_states={q0})\n\n# Add transitions\npda.add_transition(q, i, Z, q, (Z, Z))\npda.add_transition(q, i, Z0, q, (Z, Z0))\npda.add_transition(q, e, Z, q, [])\npda.add_transition(q, Epsilon(), Z0, q0, [])\n\n# Transformation to a PDA accepting by empty stack\npda_empty_stack = pda.to_empty_stack()\n# Transformation to a PDA accepting by final state\npda_final_state = pda_empty_stack.to_final_state()\n```\n\n### CFG and PDA\n\nAs CFG and PDA are equivalent, one can turn one into the other, but needs to be careful about whether the PDA accepts on empty stack and final state. The conversions between CFG and PDA are done when the PDA is accepting by empty stack\n\n```python\nfrom pyformlang.cfg import Production, Variable, Terminal, CFG\n\nter_a = Terminal(\"a\")\nter_b = Terminal(\"b\")\nter_c = Terminal(\"c\")\nvar_S = Variable(\"S\")\nproductions = {Production(var_S, [ter_a, var_S, ter_b]),\n Production(var_S, [ter_c])}\ncfg = CFG(productions=productions, start_symbol=var_S)\n\n# Convert into a PDA accepting by final state\npda_empty_stack = cfg.to_pda()\n# Go to final state\npda_final_state = pda_empty_stack.to_final_state()\n# Go back to empty stack, necessary to transform into a CFG\npda_empty_stack = pda_final_state.to_empty_stack()\n# Transform the PDA into a CFG\ncfg = pda_empty_stack.to_cfg()\n```\n\n### Indexed Grammars\n\nIndexed grammars are grammars which have a stack which can be duplicated. In an indexed grammar, rules can take 4 forms (sigma is the stack):\n\n* *EndRule*: This simply turns a Variable into a terminal, for example A[sigma]->a\n* *ProductionRule*: We push something on the stack, for example A[sigma]->B[f sigma]\n* *ConsumptionRule*: We consume something from the stack, for example A[f sigma] -> C[sigma]\n* *DuplicationRule*: We duplicate the stack, for example A[sigma] -> B[sigma] C[sigma]\n\n```python\nfrom pyformlang.indexed_grammar import Rules\nfrom pyformlang.indexed_grammar import ConsumptionRule\nfrom pyformlang.indexed_grammar import EndRule\nfrom pyformlang.indexed_grammar import ProductionRule\nfrom pyformlang.indexed_grammar import DuplicationRule\nfrom pyformlang.indexed_grammar import IndexedGrammar\n\nl_rules = []\n\n# Initialization rules\nl_rules.append(ProductionRule(\"S\", \"Cinit\", \"end\"))\nl_rules.append(ProductionRule(\"Cinit\", \"C\", \"b\"))\nl_rules.append(ConsumptionRule(\"end\", \"C\", \"T\"))\nl_rules.append(EndRule(\"T\", \"epsilon\"))\n\n# C[cm sigma] -> cm C[sigma]\nl_rules.append(ConsumptionRule(\"cm\", \"C\", \"B0\"))\nl_rules.append(DuplicationRule(\"B0\", \"A0\", \"C\"))\nl_rules.append(EndRule(\"A0\", \"cm\"))\n\nrules = Rules(l_rules)\ni_grammar = IndexedGrammar(rules)\nself.assertTrue(i_grammar.is_empty())\n```\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/Aunsiels/pyformlang", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "pyformlang", "package_url": "https://pypi.org/project/pyformlang/", "platform": "", "project_url": "https://pypi.org/project/pyformlang/", "project_urls": { "Homepage": "https://github.com/Aunsiels/pyformlang" }, "release_url": "https://pypi.org/project/pyformlang/0.1.14/", "requires_dist": null, "requires_python": "", "summary": "A python framework for formal grammars", "version": "0.1.14" }, "last_serial": 5347424, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "c7f086e5729ee179c0b59803e15132e5", "sha256": "13e92533022c8157bd10f0e037caa67f73a77829859ca83fbfd05ab4540679de" }, "downloads": -1, "filename": "pyformlang-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c7f086e5729ee179c0b59803e15132e5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13629, "upload_time": "2019-01-10T14:28:44", "url": "https://files.pythonhosted.org/packages/92/15/6808f64af2be0a5d388955d17a608e74c12cbe30e371cfd140faaca6f9ea/pyformlang-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "39899c2841b895bd848116841665bc21", "sha256": "b5bfff778434627dfe39e0045c264a3f88d37ce2b60edf04820f7e6a0f959b67" }, "downloads": -1, "filename": "pyformlang-0.0.1.tar.gz", "has_sig": false, "md5_digest": "39899c2841b895bd848116841665bc21", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5879, "upload_time": "2019-01-10T14:28:46", "url": "https://files.pythonhosted.org/packages/70/ce/5f5426bbd5dd8356f6836e4d7ff7e9a1dcf2bbe09644aa3059d4bf687332/pyformlang-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "8deea48da5395a9003b5ef80b422e52b", "sha256": "6cc19578d58076e4752ccd4d5245c4271296a934fa6136e87bea9cfa70d14e65" }, "downloads": -1, "filename": "pyformlang-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "8deea48da5395a9003b5ef80b422e52b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17625, "upload_time": "2019-01-10T18:52:19", "url": "https://files.pythonhosted.org/packages/96/c8/de3c4bf9d0d58ddf919746d56fcd67a38376aee31147829d7818c2c71d78/pyformlang-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3c566fd216e988a1324eca665af36eca", "sha256": "05b75bcc80b8c6516aa38fdbdef7ce9b0bc483dae10c92a4f28857bb126ea91b" }, "downloads": -1, "filename": "pyformlang-0.0.2.tar.gz", "has_sig": false, "md5_digest": "3c566fd216e988a1324eca665af36eca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8221, "upload_time": "2019-01-10T18:52:21", "url": "https://files.pythonhosted.org/packages/68/1b/a63de5615193b2bdb3953d2b6dfa8f1ec4a9e93012fe625253674dfe6aa4/pyformlang-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "0f635ea29775c134ef6850de2626f683", "sha256": "e94561a85463eeb082b9fdda82d888dcf34695430970c0d61d9e04af9a12c18a" }, "downloads": -1, "filename": "pyformlang-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "0f635ea29775c134ef6850de2626f683", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29453, "upload_time": "2019-02-04T13:40:52", "url": "https://files.pythonhosted.org/packages/87/7a/3cfa95c52d81c8e65158501d10d693f6a9b042de9f55b058528fed80dfdb/pyformlang-0.0.3-py3-none-any.whl" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "42912d66390d20f5912ed5edd1aaf887", "sha256": "62e8af8b39ef47343ced296eb91af124baa56f81a950f78125f506666f3d8b73" }, "downloads": -1, "filename": "pyformlang-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "42912d66390d20f5912ed5edd1aaf887", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 61391, "upload_time": "2019-03-28T16:43:45", "url": "https://files.pythonhosted.org/packages/c6/03/bbfa147510988ed9f11767242670c531ab7c5bad4c720726a85a14a95481/pyformlang-0.1.0-py3-none-any.whl" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "456866e2f04aa0f82c46a229db5f5235", "sha256": "6ee389b6cb6af8425fda66e21241ec4ee790d40a741e9afba5197be94bab6828" }, "downloads": -1, "filename": "pyformlang-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "456866e2f04aa0f82c46a229db5f5235", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 61425, "upload_time": "2019-03-28T17:29:18", "url": "https://files.pythonhosted.org/packages/f4/7b/8eaffd19edf3de4363de24f2f532b4f425ad2bb7379630a30dd5b9c02274/pyformlang-0.1.1-py3-none-any.whl" } ], "0.1.10": [ { "comment_text": "", "digests": { "md5": "a997281c5b6eadaf821f729449e20a21", "sha256": "c1d4b46e118dbe4a2906ec2e5e9e4b3d392de73d05f19eea60a9b436e1259435" }, "downloads": -1, "filename": "pyformlang-0.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "a997281c5b6eadaf821f729449e20a21", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 77883, "upload_time": "2019-05-14T16:11:35", "url": "https://files.pythonhosted.org/packages/2f/1e/8346169f0adde9d7eec84cc464dc845dc707246ac9a9dabdd12aa4ca26e8/pyformlang-0.1.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "17067cd660ac9b18ecbef9589ad8e1f6", "sha256": "fcda3d15069dc8e58b0ad66720e41086a38d3c0cb7227d771c2467f736903962" }, "downloads": -1, "filename": "pyformlang-0.1.10.tar.gz", "has_sig": false, "md5_digest": "17067cd660ac9b18ecbef9589ad8e1f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53851, "upload_time": "2019-05-14T16:11:38", "url": "https://files.pythonhosted.org/packages/54/2c/3506bb6ae9f78a9a59a519501698c5d48cd8e8e0d4ee048d812da753b655/pyformlang-0.1.10.tar.gz" } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "dcde77f0a81fee9d2f246d35fa007b98", "sha256": "a04f7246ae4ed9ca0187c895a80ea979b7568a8f906136e7d0a89d76d01aa405" }, "downloads": -1, "filename": "pyformlang-0.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "dcde77f0a81fee9d2f246d35fa007b98", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 78124, "upload_time": "2019-05-15T00:50:41", "url": "https://files.pythonhosted.org/packages/58/5b/b9160caa6c6b977bc2b2569171bb9349042dda89cdbe1eee523a82a09fa3/pyformlang-0.1.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9f282c5f9d2b46c94d9d9b73af3757fc", "sha256": "f3192c44d3ba0bfb81464f8b757f950a06212806d8698dded672cc9572922636" }, "downloads": -1, "filename": "pyformlang-0.1.11.tar.gz", "has_sig": false, "md5_digest": "9f282c5f9d2b46c94d9d9b73af3757fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54126, "upload_time": "2019-05-15T00:50:43", "url": "https://files.pythonhosted.org/packages/d6/f4/2553579333055124f5d4bb3441e60f7bd67e7d68abadaf30ae0a237474a0/pyformlang-0.1.11.tar.gz" } ], "0.1.12": [ { "comment_text": "", "digests": { "md5": "91eb01fab9ba775f4d55fc67a1e0a8b7", "sha256": "6dc5abe815bf42408d1da6aa6f8d8775c2aabf411648023173868a988a072bbb" }, "downloads": -1, "filename": "pyformlang-0.1.12-py3-none-any.whl", "has_sig": false, "md5_digest": "91eb01fab9ba775f4d55fc67a1e0a8b7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 78764, "upload_time": "2019-05-16T09:36:04", "url": "https://files.pythonhosted.org/packages/57/1e/d5bbe51aa0df182dd6afc910bd869403e22646d0f6c7732d04c7a2eff388/pyformlang-0.1.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cff581d669be606f13cbeda61e4570c0", "sha256": "4cfa993caec46008b9c389dbf3c9f788862e5480a25342330b75026a2dd23cd4" }, "downloads": -1, "filename": "pyformlang-0.1.12.tar.gz", "has_sig": false, "md5_digest": "cff581d669be606f13cbeda61e4570c0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54834, "upload_time": "2019-05-16T09:36:07", "url": "https://files.pythonhosted.org/packages/27/20/7b05ecef7534069a62c546b9923fef076557eec851b88e771cda2834588d/pyformlang-0.1.12.tar.gz" } ], "0.1.13": [ { "comment_text": "", "digests": { "md5": "168e4da40c38102920e05c61920e65c5", "sha256": "c827d818ead23a5eebc081ea9835803e43e58bc9123a1f895db85a717830b589" }, "downloads": -1, "filename": "pyformlang-0.1.13-py3-none-any.whl", "has_sig": false, "md5_digest": "168e4da40c38102920e05c61920e65c5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 79149, "upload_time": "2019-05-18T13:55:10", "url": "https://files.pythonhosted.org/packages/37/de/66f2a1932449e681bff23c1f7a90d211c5136ba29c12bf2375aaed1198ae/pyformlang-0.1.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ce27d2454842e8f29c60ff9eccf7d287", "sha256": "fbef583bf7e4dccc2e75b760c90165980490d21f56e89add16fdc3edd784041b" }, "downloads": -1, "filename": "pyformlang-0.1.13.tar.gz", "has_sig": false, "md5_digest": "ce27d2454842e8f29c60ff9eccf7d287", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55147, "upload_time": "2019-05-18T13:55:12", "url": "https://files.pythonhosted.org/packages/3d/55/e221d35571d724eea679cc1f50e6f3a5c9186f8a604640611dfd211b125f/pyformlang-0.1.13.tar.gz" } ], "0.1.14": [ { "comment_text": "", "digests": { "md5": "db2489526d0dfd02ad00cd3acb5aa06b", "sha256": "309e616923fc0cd63dbf7898159c9f28d7c562724d9d59904e7202dab3e8dc7f" }, "downloads": -1, "filename": "pyformlang-0.1.14-py3-none-any.whl", "has_sig": false, "md5_digest": "db2489526d0dfd02ad00cd3acb5aa06b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 80123, "upload_time": "2019-06-01T21:51:38", "url": "https://files.pythonhosted.org/packages/d6/a3/bcae709ba19598c7f8c933f9e67a2e3924321521760c08301e3172889a8a/pyformlang-0.1.14-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e7053dd7d71409c6c837da549311c901", "sha256": "c3a12f317e24e09f04abd9d9db35464d3d189457f2b4e12890f9b5215d42eba4" }, "downloads": -1, "filename": "pyformlang-0.1.14.tar.gz", "has_sig": false, "md5_digest": "e7053dd7d71409c6c837da549311c901", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55830, "upload_time": "2019-06-01T21:51:40", "url": "https://files.pythonhosted.org/packages/2f/60/faee1c4b17216901b081a24a02ad58c43694042b41dffa06ab1eab853f40/pyformlang-0.1.14.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "45693e01999144d4057b747e95f407af", "sha256": "6a94314e9b20d46b43c2ce1b87b798bf225954c926a31450398c589ffdf1da2f" }, "downloads": -1, "filename": "pyformlang-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "45693e01999144d4057b747e95f407af", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 64933, "upload_time": "2019-03-29T16:26:39", "url": "https://files.pythonhosted.org/packages/79/a6/934c4e141f88b3b04956f23889c9fbb673c086a570e539d56f212faf367c/pyformlang-0.1.2-py3-none-any.whl" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "fcc0c3a1b2cd9e6536a3e6d7d26693b5", "sha256": "ac94d6acb5e269dc894f04e800dc0c05edeb0c0fc1a8444c09ecb2fa06ac81c2" }, "downloads": -1, "filename": "pyformlang-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "fcc0c3a1b2cd9e6536a3e6d7d26693b5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 72835, "upload_time": "2019-05-07T12:37:44", "url": "https://files.pythonhosted.org/packages/28/08/15250ba3942aff46d5309006ad329cf19692ed472c0afb55d06ffda29350/pyformlang-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "882c5dc37a5f89c9a1926fe8526ed744", "sha256": "903672c5756358fb382f86cc2e1ce35444d9c7ba2ee594e7a14fa84e3049696c" }, "downloads": -1, "filename": "pyformlang-0.1.3.tar.gz", "has_sig": false, "md5_digest": "882c5dc37a5f89c9a1926fe8526ed744", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50268, "upload_time": "2019-05-07T12:37:46", "url": "https://files.pythonhosted.org/packages/8f/b1/07df2dccb12909cc40e93232306f364e831725005e1262f06fea9781cc5b/pyformlang-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "c63d5ec981cbe8bd89880ccc70b5d8fe", "sha256": "4d08f1416947706684341d482b3a13c15e74ed832964e6b02e515878d7b9ee8c" }, "downloads": -1, "filename": "pyformlang-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "c63d5ec981cbe8bd89880ccc70b5d8fe", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 72838, "upload_time": "2019-05-07T13:26:46", "url": "https://files.pythonhosted.org/packages/c2/52/b35b266f3faf1b33daae7364392e5101d363d1a12bc22a414c3b2dbfc438/pyformlang-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4776468e946bd1306f05c6c00abb65d2", "sha256": "543be4274e29bb7fcfbc411f507f5a6fff90495e1bed3052ff99ac323bb98a1d" }, "downloads": -1, "filename": "pyformlang-0.1.4.tar.gz", "has_sig": false, "md5_digest": "4776468e946bd1306f05c6c00abb65d2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50273, "upload_time": "2019-05-07T13:26:47", "url": "https://files.pythonhosted.org/packages/5a/fd/a41f86eff774ce14308555cec9187fe7806adde39bbbf27375be1399202d/pyformlang-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "ce4fc6447c4938512c359f760745e1e2", "sha256": "2bf0d497db817e54e43f6ffb2d4417a8dff83944246ed1acac4401945ab26529" }, "downloads": -1, "filename": "pyformlang-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "ce4fc6447c4938512c359f760745e1e2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 72854, "upload_time": "2019-05-07T15:03:53", "url": "https://files.pythonhosted.org/packages/37/29/6a2a93f7169c67aba2dace444d522a5787b695e19b2226b5d1416597290f/pyformlang-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d70b004814b8c2dea86644d8f2e18d76", "sha256": "9fe6240e20f902e0846b61dd47ee63efcb7d8259b2ae92124e349e1a107d4500" }, "downloads": -1, "filename": "pyformlang-0.1.5.tar.gz", "has_sig": false, "md5_digest": "d70b004814b8c2dea86644d8f2e18d76", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50287, "upload_time": "2019-05-07T15:03:55", "url": "https://files.pythonhosted.org/packages/1f/ff/0ac429db3eb67af351ac267c8e1d675e874d43c8207b7a79b0ca6ff7dfab/pyformlang-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "6c67517453d371be5afa0c668bc95a11", "sha256": "6952d07ba3f9faa2d8ce4311d11e4824b9070f6080ab466110ad42d879cc3a72" }, "downloads": -1, "filename": "pyformlang-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "6c67517453d371be5afa0c668bc95a11", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 73424, "upload_time": "2019-05-08T08:57:38", "url": "https://files.pythonhosted.org/packages/ed/0d/5535815d263ea74ee46938fb5511552890ab696e8323d8811853f5784dc2/pyformlang-0.1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fa0a78676a83d9a1640907d7245b10bd", "sha256": "d6e95740bd86f375c933c82364736ac38a9721d295996763be11cdcbc19f2a7d" }, "downloads": -1, "filename": "pyformlang-0.1.6.tar.gz", "has_sig": false, "md5_digest": "fa0a78676a83d9a1640907d7245b10bd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50593, "upload_time": "2019-05-08T08:57:40", "url": "https://files.pythonhosted.org/packages/d9/2d/ea2ba2497b26eacafb4fdbbdf562651beb51747d6c5377bd50966540eb6d/pyformlang-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "825ba08128d3d423f56df1fd5d02c658", "sha256": "96e4eb8bcb05a920bbd67c89520a0f3281f61a6f8402ad1068d3fdebc58af221" }, "downloads": -1, "filename": "pyformlang-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "825ba08128d3d423f56df1fd5d02c658", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 73936, "upload_time": "2019-05-09T08:18:30", "url": "https://files.pythonhosted.org/packages/0a/06/3bf6314d75b586bb2f6b3a6771286c4d1fd0ab8c361e66647e82182d9acf/pyformlang-0.1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f263b61ee67da75eea1374b2e4351100", "sha256": "3bb9b0e0f33cc9f941f41f9c2ecf0f6978fed2a354eee190411c2272bf922877" }, "downloads": -1, "filename": "pyformlang-0.1.7.tar.gz", "has_sig": false, "md5_digest": "f263b61ee67da75eea1374b2e4351100", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51119, "upload_time": "2019-05-09T08:18:31", "url": "https://files.pythonhosted.org/packages/7a/bb/745c9515643afb4e7f40417e9e501e6cbe33fa08ba9639a0d55f4c264ce8/pyformlang-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "d2a1a4135651d65324e142386ae7b292", "sha256": "25104d41d69834f0126cce8af2fd75fba6db351d877934534827784989db0174" }, "downloads": -1, "filename": "pyformlang-0.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "d2a1a4135651d65324e142386ae7b292", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 74133, "upload_time": "2019-05-09T13:25:35", "url": "https://files.pythonhosted.org/packages/ca/ad/3269f77d83eed2a980c6bb818e5d448435e04eca6f2d2b99aec9289bd7ff/pyformlang-0.1.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6129f8bdbb63ddf58536d8cb57a14d9c", "sha256": "38dbd691c7f538b51a5862dc6040384de9af9a5341f8c4cc5a1d53de796c5eee" }, "downloads": -1, "filename": "pyformlang-0.1.8.tar.gz", "has_sig": false, "md5_digest": "6129f8bdbb63ddf58536d8cb57a14d9c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51280, "upload_time": "2019-05-09T13:25:36", "url": "https://files.pythonhosted.org/packages/b4/b2/5e8011895e5e27141215f4880892849a42245d1021d3462bda77089fd05b/pyformlang-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "0a64baf5b68622b7a43557177147ec29", "sha256": "0824ba2ccc750beee67fb61f743c1939c704a836b85d005dbd5ea1699646b727" }, "downloads": -1, "filename": "pyformlang-0.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "0a64baf5b68622b7a43557177147ec29", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 75141, "upload_time": "2019-05-13T15:08:05", "url": "https://files.pythonhosted.org/packages/ce/c1/051f92ad480583132fa7532c7eb7031a295cde7441e2c04c0adf616e608c/pyformlang-0.1.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bac4fe53615cb8d861606c1e44b5a5d1", "sha256": "3703203622175f898fcd589fa6540c12ae2bf2d05f39fc21fe5d5648ba6aa0f6" }, "downloads": -1, "filename": "pyformlang-0.1.9.tar.gz", "has_sig": false, "md5_digest": "bac4fe53615cb8d861606c1e44b5a5d1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52250, "upload_time": "2019-05-13T15:08:07", "url": "https://files.pythonhosted.org/packages/fa/75/db62bda3431277ae8f20514a2fe2997074f7ac282f5fea73ba0875aaa444/pyformlang-0.1.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "db2489526d0dfd02ad00cd3acb5aa06b", "sha256": "309e616923fc0cd63dbf7898159c9f28d7c562724d9d59904e7202dab3e8dc7f" }, "downloads": -1, "filename": "pyformlang-0.1.14-py3-none-any.whl", "has_sig": false, "md5_digest": "db2489526d0dfd02ad00cd3acb5aa06b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 80123, "upload_time": "2019-06-01T21:51:38", "url": "https://files.pythonhosted.org/packages/d6/a3/bcae709ba19598c7f8c933f9e67a2e3924321521760c08301e3172889a8a/pyformlang-0.1.14-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e7053dd7d71409c6c837da549311c901", "sha256": "c3a12f317e24e09f04abd9d9db35464d3d189457f2b4e12890f9b5215d42eba4" }, "downloads": -1, "filename": "pyformlang-0.1.14.tar.gz", "has_sig": false, "md5_digest": "e7053dd7d71409c6c837da549311c901", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55830, "upload_time": "2019-06-01T21:51:40", "url": "https://files.pythonhosted.org/packages/2f/60/faee1c4b17216901b081a24a02ad58c43694042b41dffa06ab1eab853f40/pyformlang-0.1.14.tar.gz" } ] }