OSDN Git Service

Rebuild docs with Python 3 and Sphinx 3.0.2.
[joypy/Thun.git] / docs / sphinx_docs / _build / html / _modules / joy / parser.html
1
2 <!DOCTYPE html>
3
4 <html>
5   <head>
6     <meta charset="utf-8" />
7     <title>joy.parser &#8212; Thun 0.2.0 documentation</title>
8     <link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
9     <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
10     <script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
11     <script src="../../_static/jquery.js"></script>
12     <script src="../../_static/underscore.js"></script>
13     <script src="../../_static/doctools.js"></script>
14     <script src="../../_static/language_data.js"></script>
15     <script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
16     <link rel="index" title="Index" href="../../genindex.html" />
17     <link rel="search" title="Search" href="../../search.html" />
18    
19   <link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
20   
21   
22   <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
23
24   </head><body>
25   
26
27     <div class="document">
28       <div class="documentwrapper">
29         <div class="bodywrapper">
30           
31
32           <div class="body" role="main">
33             
34   <h1>Source code for joy.parser</h1><div class="highlight"><pre>
35 <span></span><span class="c1"># -*- coding: utf-8 -*-</span>
36 <span class="c1">#</span>
37 <span class="c1">#    Copyright © 2014, 2015, 2016, 2017 Simon Forman</span>
38 <span class="c1">#</span>
39 <span class="c1">#    This file is part of Thun.</span>
40 <span class="c1">#</span>
41 <span class="c1">#    Thun is free software: you can redistribute it and/or modify</span>
42 <span class="c1">#    it under the terms of the GNU General Public License as published by</span>
43 <span class="c1">#    the Free Software Foundation, either version 3 of the License, or</span>
44 <span class="c1">#    (at your option) any later version.</span>
45 <span class="c1">#</span>
46 <span class="c1">#    Thun is distributed in the hope that it will be useful,</span>
47 <span class="c1">#    but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
48 <span class="c1">#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
49 <span class="c1">#    GNU General Public License for more details.</span>
50 <span class="c1">#</span>
51 <span class="c1">#    You should have received a copy of the GNU General Public License</span>
52 <span class="c1">#    along with Thun.  If not see &lt;http://www.gnu.org/licenses/&gt;.</span>
53 <span class="c1">#</span>
54 <span class="sd">&#39;&#39;&#39;</span>
55 <span class="sd">This module exports a single function for converting text to a joy</span>
56 <span class="sd">expression as well as a single Symbol class and a single Exception type.</span>
57
58 <span class="sd">The Symbol string class is used by the interpreter to recognize literals</span>
59 <span class="sd">by the fact that they are not Symbol objects.</span>
60
61 <span class="sd">A crude grammar::</span>
62
63 <span class="sd">    joy = term*</span>
64 <span class="sd">    term = int | float | string | &#39;[&#39; joy &#39;]&#39; | symbol</span>
65
66 <span class="sd">A Joy expression is a sequence of zero or more terms.  A term is a</span>
67 <span class="sd">literal value (integer, float, string, or Joy expression) or a function</span>
68 <span class="sd">symbol.  Function symbols are unquoted strings and cannot contain square</span>
69 <span class="sd">brackets.   Terms must be separated by blanks, which can be omitted</span>
70 <span class="sd">around square brackets.</span>
71
72 <span class="sd">&#39;&#39;&#39;</span>
73 <span class="kn">from</span> <span class="nn">re</span> <span class="kn">import</span> <span class="n">Scanner</span>
74 <span class="kn">from</span> <span class="nn">.utils.stack</span> <span class="kn">import</span> <span class="n">list_to_stack</span>
75
76
77 <span class="c1">#TODO: explain the details of float lits and strings.</span>
78 <span class="n">FLOAT</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">&#39;-?\d+\.\d*&#39;</span>
79 <span class="n">INT</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">&#39;-?\d+&#39;</span>
80 <span class="n">SYMBOL</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">&#39;[•\w!@$%^&amp;*()_+&lt;&gt;?|\/;:`~,.=-]+&#39;</span>
81 <span class="n">BRACKETS</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">&#39;\[|\]&#39;</span>
82 <span class="n">STRING_DOUBLE_QUOTED</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">&#39;&quot;(?:[^&quot;</span><span class="se">\\</span><span class="s1">]|</span><span class="se">\\</span><span class="s1">.)*&quot;&#39;</span>
83 <span class="n">STRING_SINGLE_QUOTED</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;&#39;(?:[^&#39;</span><span class="se">\\</span><span class="s2">]|</span><span class="se">\\</span><span class="s2">.)*&#39;&quot;</span>
84 <span class="n">BLANKS</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">&#39;\s+&#39;</span>
85
86
87 <div class="viewcode-block" id="Symbol"><a class="viewcode-back" href="../../parser.html#joy.parser.Symbol">[docs]</a><span class="k">class</span> <span class="nc">Symbol</span><span class="p">(</span><span class="nb">str</span><span class="p">):</span>
88         <span class="sd">&#39;&#39;&#39;A string class that represents Joy function names.&#39;&#39;&#39;</span>
89         <span class="fm">__repr__</span> <span class="o">=</span> <span class="nb">str</span><span class="o">.</span><span class="fm">__str__</span></div>
90
91
92 <div class="viewcode-block" id="text_to_expression"><a class="viewcode-back" href="../../parser.html#joy.parser.text_to_expression">[docs]</a><span class="k">def</span> <span class="nf">text_to_expression</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
93         <span class="sd">&#39;&#39;&#39;Convert a string to a Joy expression.</span>
94
95 <span class="sd">       When supplied with a string this function returns a Python datastructure</span>
96 <span class="sd">       that represents the Joy datastructure described by the text expression.</span>
97 <span class="sd">       Any unbalanced square brackets will raise a ParseError.</span>
98
99 <span class="sd">       :param str text: Text to convert.</span>
100 <span class="sd">       :rtype: stack</span>
101 <span class="sd">       :raises ParseError: if the parse fails.</span>
102 <span class="sd">       &#39;&#39;&#39;</span>
103         <span class="k">return</span> <span class="n">_parse</span><span class="p">(</span><span class="n">_tokenize</span><span class="p">(</span><span class="n">text</span><span class="p">))</span></div>
104
105
106 <div class="viewcode-block" id="ParseError"><a class="viewcode-back" href="../../parser.html#joy.parser.ParseError">[docs]</a><span class="k">class</span> <span class="nc">ParseError</span><span class="p">(</span><span class="ne">ValueError</span><span class="p">):</span>
107         <span class="sd">&#39;&#39;&#39;Raised when there is a error while parsing text.&#39;&#39;&#39;</span></div>
108
109
110 <span class="k">def</span> <span class="nf">_tokenize</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
111         <span class="sd">&#39;&#39;&#39;Convert a text into a stream of tokens.</span>
112
113 <span class="sd">       Converts function names to Symbols.</span>
114
115 <span class="sd">       Raise ParseError (with some of the failing text) if the scan fails.</span>
116 <span class="sd">       &#39;&#39;&#39;</span>
117         <span class="n">tokens</span><span class="p">,</span> <span class="n">rest</span> <span class="o">=</span> <span class="n">_scanner</span><span class="o">.</span><span class="n">scan</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
118         <span class="k">if</span> <span class="n">rest</span><span class="p">:</span>
119                 <span class="k">raise</span> <span class="n">ParseError</span><span class="p">(</span>
120                         <span class="s1">&#39;Scan failed at position </span><span class="si">%i</span><span class="s1">, </span><span class="si">%r</span><span class="s1">&#39;</span>
121                         <span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">rest</span><span class="p">),</span> <span class="n">rest</span><span class="p">[:</span><span class="mi">10</span><span class="p">])</span>
122                         <span class="p">)</span>
123         <span class="k">return</span> <span class="n">tokens</span>
124
125
126 <span class="k">def</span> <span class="nf">_parse</span><span class="p">(</span><span class="n">tokens</span><span class="p">):</span>
127         <span class="sd">&#39;&#39;&#39;</span>
128 <span class="sd">       Return a stack/list expression of the tokens.</span>
129 <span class="sd">       &#39;&#39;&#39;</span>
130         <span class="n">frame</span> <span class="o">=</span> <span class="p">[]</span>
131         <span class="n">stack</span> <span class="o">=</span> <span class="p">[]</span>
132         <span class="k">for</span> <span class="n">tok</span> <span class="ow">in</span> <span class="n">tokens</span><span class="p">:</span>
133                 <span class="k">if</span> <span class="n">tok</span> <span class="o">==</span> <span class="s1">&#39;[&#39;</span><span class="p">:</span>
134                         <span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">frame</span><span class="p">)</span>
135                         <span class="n">frame</span> <span class="o">=</span> <span class="p">[]</span>
136                         <span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">frame</span><span class="p">)</span>
137                 <span class="k">elif</span> <span class="n">tok</span> <span class="o">==</span> <span class="s1">&#39;]&#39;</span><span class="p">:</span>
138                         <span class="k">try</span><span class="p">:</span>
139                                 <span class="n">frame</span> <span class="o">=</span> <span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
140                         <span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
141                                 <span class="k">raise</span> <span class="n">ParseError</span><span class="p">(</span><span class="s1">&#39;Extra closing bracket.&#39;</span><span class="p">)</span>
142                         <span class="n">frame</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">list_to_stack</span><span class="p">(</span><span class="n">frame</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
143                 <span class="k">else</span><span class="p">:</span>
144                         <span class="n">frame</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tok</span><span class="p">)</span>
145         <span class="k">if</span> <span class="n">stack</span><span class="p">:</span>
146                 <span class="k">raise</span> <span class="n">ParseError</span><span class="p">(</span><span class="s1">&#39;Unclosed bracket.&#39;</span><span class="p">)</span>
147         <span class="k">return</span> <span class="n">list_to_stack</span><span class="p">(</span><span class="n">frame</span><span class="p">)</span>
148
149
150 <span class="n">_scanner</span> <span class="o">=</span> <span class="n">Scanner</span><span class="p">([</span>
151         <span class="p">(</span><span class="n">FLOAT</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">_</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">float</span><span class="p">(</span><span class="n">token</span><span class="p">)),</span>
152         <span class="p">(</span><span class="n">INT</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">_</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">token</span><span class="p">)),</span>
153         <span class="p">(</span><span class="n">SYMBOL</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">_</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="n">Symbol</span><span class="p">(</span><span class="n">token</span><span class="p">)),</span>
154         <span class="p">(</span><span class="n">BRACKETS</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">_</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="n">token</span><span class="p">),</span>
155         <span class="p">(</span><span class="n">STRING_DOUBLE_QUOTED</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">_</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="n">token</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="s1">&#39;&quot;&#39;</span><span class="p">)),</span>
156         <span class="p">(</span><span class="n">STRING_SINGLE_QUOTED</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">_</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="n">token</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&#39;&quot;</span><span class="p">,</span> <span class="s2">&quot;&#39;&quot;</span><span class="p">)),</span>
157         <span class="p">(</span><span class="n">BLANKS</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
158         <span class="p">])</span>
159 </pre></div>
160
161           </div>
162           
163         </div>
164       </div>
165       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
166         <div class="sphinxsidebarwrapper">
167 <h1 class="logo"><a href="../../index.html">Thun</a></h1>
168
169
170
171
172
173
174
175
176 <h3>Navigation</h3>
177 <ul>
178 <li class="toctree-l1"><a class="reference internal" href="../../notebooks/Intro.html">Thun: Joy in Python</a></li>
179 <li class="toctree-l1"><a class="reference internal" href="../../joy.html">Joy Interpreter</a></li>
180 <li class="toctree-l1"><a class="reference internal" href="../../stack.html">Stack or Quote or Sequence or List…</a></li>
181 <li class="toctree-l1"><a class="reference internal" href="../../parser.html">Parsing Text into Joy Expressions</a></li>
182 <li class="toctree-l1"><a class="reference internal" href="../../pretty.html">Tracing Joy Execution</a></li>
183 <li class="toctree-l1"><a class="reference internal" href="../../library.html">Function Reference</a></li>
184 <li class="toctree-l1"><a class="reference internal" href="../../lib.html">Functions Grouped by, er, Function with Examples</a></li>
185 <li class="toctree-l1"><a class="reference internal" href="../../types.html">Type Inference of Joy Expressions</a></li>
186 <li class="toctree-l1"><a class="reference internal" href="../../notebooks/index.html">Essays about Programming in Joy</a></li>
187 </ul>
188
189 <div class="relations">
190 <h3>Related Topics</h3>
191 <ul>
192   <li><a href="../../index.html">Documentation overview</a><ul>
193   <li><a href="../index.html">Module code</a><ul>
194   </ul></li>
195   </ul></li>
196 </ul>
197 </div>
198 <div id="searchbox" style="display: none" role="search">
199   <h3 id="searchlabel">Quick search</h3>
200     <div class="searchformwrapper">
201     <form class="search" action="../../search.html" method="get">
202       <input type="text" name="q" aria-labelledby="searchlabel" />
203       <input type="submit" value="Go" />
204     </form>
205     </div>
206 </div>
207 <script>$('#searchbox').show(0);</script>
208
209
210
211
212
213
214
215
216         </div>
217       </div>
218       <div class="clearer"></div>
219     </div>
220     <div class="footer" role="contentinfo">
221 <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">
222 <img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" />
223 </a>
224 <br />
225 <span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">Thun Documentation</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="https://joypy.osdn.io/" property="cc:attributionName" rel="cc:attributionURL">Simon Forman</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.<br />Based on a work at <a xmlns:dct="http://purl.org/dc/terms/" href="https://osdn.net/projects/joypy/" rel="dct:source">https://osdn.net/projects/joypy/</a>.
226       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.2.
227     </div>
228
229   </body>
230 </html>