<?xml version="1.0" encoding="iso-8859-1"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#">
<title>Zyrianes / _(sandbox)</title>
<link rel="alternate" type="text/html" href="http://home.zyrianes.net/blog/Sections/40/"/>
<modified>2004-09-26T14:05:49Z</modified>



<entry>
<title>rst doc</title>
<link rel="alternate" type="text/html" href="http://home.zyrianes.net/blog/Articles/146/"/>
<id>http://home.zyrianes.net/blog/Articles/146/</id>

<author>
<name>ludovic Bellier</name>
</author>
<issued>2004-09-26T14:05:49Z</issued>
<modified>2004-09-26T14:05:49Z</modified>
<content type="text/html" mode="escaped">
Quick Reference : &lt;a class="reference" href="http://docutils.sourceforge.net/docs/user/rst/quickref.html"&gt;http://docutils.sourceforge.net/docs/user/rst/quickref.html&lt;/a&gt;
</content>
</entry>

<entry>
<title>statemachine.py</title>
<link rel="alternate" type="text/html" href="http://home.zyrianes.net/blog/Articles/130/"/>
<id>http://home.zyrianes.net/blog/Articles/130/</id>

<author>
<name>ludovic Bellier</name>
</author>
<issued>2004-06-02T22:00:44Z</issued>
<modified>2004-06-02T22:00:44Z</modified>
<content type="text/html" mode="escaped">
&lt;p&gt;A finite state machine specialized for regular-expression-based text filters,
this module defines the following classes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;cite&gt;StateMachine&lt;/cite&gt;, a state machine&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;State&lt;/cite&gt;, a state superclass&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;StateMachineWS&lt;/cite&gt;, a whitespace-sensitive version of &lt;cite&gt;StateMachine&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;StateWS&lt;/cite&gt;, a state superclass for use with &lt;cite&gt;StateMachineWS&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;SearchStateMachine&lt;/cite&gt;, uses &lt;cite&gt;re.search()&lt;/cite&gt; instead of &lt;cite&gt;re.match()&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;SearchStateMachineWS&lt;/cite&gt;, uses &lt;cite&gt;re.search()&lt;/cite&gt; instead of &lt;cite&gt;re.match()&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;ViewList&lt;/cite&gt;, extends standard Python lists.&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;StringList&lt;/cite&gt;, string-specific ViewList.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Exception classes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;cite&gt;StateMachineError&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;UnknownStateError&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;DuplicateStateError&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;UnknownTransitionError&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;DuplicateTransitionError&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;TransitionPatternNotFound&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;TransitionMethodNotFound&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;UnexpectedIndentationError&lt;/cite&gt;&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;TransitionCorrection&lt;/cite&gt;: Raised to switch to another transition.&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;StateCorrection&lt;/cite&gt;: Raised to switch to another state &amp;amp; transition.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Functions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;cite&gt;string2lines()&lt;/cite&gt;: split a multi-line string into a list of one-line strings&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="how-to-use-this-module"&gt;
&lt;h1&gt;&lt;a name="how-to-use-this-module"&gt;How To Use This Module&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;(See the individual classes, methods, and attributes for details.)&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;Import it: &lt;tt class="literal"&gt;&lt;span class="pre"&gt;import&lt;/span&gt; &lt;span class="pre"&gt;statemachine&lt;/span&gt;&lt;/tt&gt; or &lt;tt class="literal"&gt;&lt;span class="pre"&gt;from&lt;/span&gt; &lt;span class="pre"&gt;statemachine&lt;/span&gt; &lt;span class="pre"&gt;import&lt;/span&gt; &lt;span class="pre"&gt;...&lt;/span&gt;&lt;/tt&gt;.
You will also need to &lt;tt class="literal"&gt;&lt;span class="pre"&gt;import&lt;/span&gt; &lt;span class="pre"&gt;re&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Derive a subclass of &lt;cite&gt;State&lt;/cite&gt; (or &lt;cite&gt;StateWS&lt;/cite&gt;) for each state in your state
machine:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
class MyState(statemachine.State):
&lt;/pre&gt;
&lt;p&gt;Within the state's class definition:&lt;/p&gt;
&lt;ol class="loweralpha"&gt;
&lt;li&gt;&lt;p class="first"&gt;Include a pattern for each transition, in &lt;cite&gt;State.patterns&lt;/cite&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
patterns = {'atransition': r'pattern', ...}
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Include a list of initial transitions to be set up automatically, in
&lt;cite&gt;State.initial_transitions&lt;/cite&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
initial_transitions = ['atransition', ...]
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Define a method for each transition, with the same name as the
transition pattern:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
def atransition(self, match, context, next_state):
    # do something
    result = [...]  # a list
    return context, next_state, result
    # context, next_state may be altered
&lt;/pre&gt;
&lt;p&gt;Transition methods may raise an &lt;cite&gt;EOFError&lt;/cite&gt; to cut processing short.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;You may wish to override the &lt;cite&gt;State.bof()&lt;/cite&gt; and/or &lt;cite&gt;State.eof()&lt;/cite&gt; implicit
transition methods, which handle the beginning- and end-of-file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;In order to handle nested processing, you may wish to override the
attributes &lt;cite&gt;State.nested_sm&lt;/cite&gt; and/or &lt;cite&gt;State.nested_sm_kwargs&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;If you are using &lt;cite&gt;StateWS&lt;/cite&gt; as a base class, in order to handle nested
indented blocks, you may wish to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;override the attributes &lt;cite&gt;StateWS.indent_sm&lt;/cite&gt;,
&lt;cite&gt;StateWS.indent_sm_kwargs&lt;/cite&gt;, &lt;cite&gt;StateWS.known_indent_sm&lt;/cite&gt;, and/or
&lt;cite&gt;StateWS.known_indent_sm_kwargs&lt;/cite&gt;;&lt;/li&gt;
&lt;li&gt;override the &lt;cite&gt;StateWS.blank()&lt;/cite&gt; method; and/or&lt;/li&gt;
&lt;li&gt;override or extend the &lt;cite&gt;StateWS.indent()&lt;/cite&gt;, &lt;cite&gt;StateWS.known_indent()&lt;/cite&gt;,
and/or &lt;cite&gt;StateWS.firstknown_indent()&lt;/cite&gt; methods.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Create a state machine object:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sm = StateMachine(state_classes=[MyState, ...],
                  initial_state='MyState')
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Obtain the input text, which needs to be converted into a tab-free list of
one-line strings. For example, to read text from a file called
'inputfile':&lt;/p&gt;
&lt;pre class="literal-block"&gt;
input_string = open('inputfile').read()
input_lines = statemachine.string2lines(input_string)
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Run the state machine on the input text and collect the results, a list:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
results = sm.run(input_lines)
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Remove any lingering circular references:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sm.unlink()
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

</content>
</entry>



</feed>