<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=SeminarHowToProgramIt%2FPipe%2FVendingMachineParser.py</id>
	<title>SeminarHowToProgramIt/Pipe/VendingMachineParser.py - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=SeminarHowToProgramIt%2FPipe%2FVendingMachineParser.py"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=SeminarHowToProgramIt/Pipe/VendingMachineParser.py&amp;action=history"/>
	<updated>2026-05-15T00:02:26Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=SeminarHowToProgramIt/Pipe/VendingMachineParser.py&amp;diff=38994&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:28, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=SeminarHowToProgramIt/Pipe/VendingMachineParser.py&amp;diff=38994&amp;oldid=prev"/>
		<updated>2021-02-07T05:28:00Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt; &lt;br /&gt;
 #VendingMachineParser.py&lt;br /&gt;
 &lt;br /&gt;
 import shlex,sys &lt;br /&gt;
 from cStringIO import StringIO &lt;br /&gt;
 from VendingMachine import *&lt;br /&gt;
 &lt;br /&gt;
 # //putCoin&lt;br /&gt;
 # //pushButton&lt;br /&gt;
 # //verifyCoin&lt;br /&gt;
 # //verifyButton&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 class VendingMachine:&lt;br /&gt;
     def putCoin(self, anAmount):&lt;br /&gt;
         print &amp;#039;%d inserted&amp;#039; % anAmount&lt;br /&gt;
     def pushButton(self, aButtonType):&lt;br /&gt;
         print aButtonType + &amp;#039; pushed&amp;#039;&lt;br /&gt;
     def verifyCoin(self, anAmount):&lt;br /&gt;
         print anAmount&lt;br /&gt;
     def verifyButton(self, aStatus):&lt;br /&gt;
         print aStatus&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 v=VendingMachine()&lt;br /&gt;
 class VendingCmd: &lt;br /&gt;
     def __init__(self,cmd,**kwargs): &lt;br /&gt;
         self.cmd = cmd&lt;br /&gt;
         self.vm=v&lt;br /&gt;
         self.__dict__.update(kwargs) &lt;br /&gt;
     def __repr__(self): &lt;br /&gt;
         s = &amp;#039;%s(&amp;#039; % self.cmd &lt;br /&gt;
         for item in self.__dict__.items(): &lt;br /&gt;
             if item[0] != &amp;#039;cmd&amp;#039;: &lt;br /&gt;
                 s += &amp;#039; %s=%s&amp;#039; % item &lt;br /&gt;
         return s + &amp;#039; )&amp;#039;&lt;br /&gt;
     def action(self):&lt;br /&gt;
         raise NotImplementedError&lt;br /&gt;
     &lt;br /&gt;
 class PutCmd(VendingCmd):&lt;br /&gt;
     def action(self):&lt;br /&gt;
         self.amount=self.arg&lt;br /&gt;
         self.vm.putCoin(self.amount)&lt;br /&gt;
         &lt;br /&gt;
 class PushCmd(VendingCmd):&lt;br /&gt;
     def action(self):&lt;br /&gt;
         self.buttonType = self.arg&lt;br /&gt;
         self.vm.pushButton(self.buttonType)&lt;br /&gt;
         &lt;br /&gt;
 class VerifyMoneyCmd(VendingCmd):&lt;br /&gt;
     def action(self):&lt;br /&gt;
         print self.vm.verifyCoin(self.amount)&lt;br /&gt;
 &lt;br /&gt;
 class VerifyButtonCmd(VendingCmd):&lt;br /&gt;
     def action(self):&lt;br /&gt;
         print self.vm.verifyButton(self.status)&lt;br /&gt;
         &lt;br /&gt;
 class Parser: &lt;br /&gt;
     def __init__(self,aStream=sys.stderr): &lt;br /&gt;
         self.outstream=aStream &lt;br /&gt;
     def next_token(self): &lt;br /&gt;
         tok = self.lexer.get_token() &lt;br /&gt;
         if not tok: &lt;br /&gt;
             self.err(&amp;#039;Unexpected end of file&amp;#039;) &lt;br /&gt;
         return tok &lt;br /&gt;
     def next_number(self,func=int): &lt;br /&gt;
         tok = self.next_token() &lt;br /&gt;
         if tok: &lt;br /&gt;
             try: tok = func(tok) &lt;br /&gt;
             except ValueError: &lt;br /&gt;
                 return self.err(&amp;#039;Expected a number, not &amp;#039;+tok) &lt;br /&gt;
         return tok &lt;br /&gt;
     def next_money(self): &lt;br /&gt;
         num=self.next_number() &lt;br /&gt;
         if num not in (10,50,100,500,1000): &lt;br /&gt;
             return self.err(&amp;#039;Unexpected money type&amp;#039;) &lt;br /&gt;
         return num &lt;br /&gt;
  &lt;br /&gt;
     def next_button(self): &lt;br /&gt;
         tok=self.lexer.get_token() &lt;br /&gt;
         if tok not in (&amp;#039;black&amp;#039;,&amp;#039;white&amp;#039;,&amp;#039;sugar_black&amp;#039;,&amp;#039;sugar_white&amp;#039;): &lt;br /&gt;
             return self.err(&amp;#039;Unexpected button type&amp;#039;) &lt;br /&gt;
         return tok &lt;br /&gt;
  &lt;br /&gt;
     def err(self,msg): &lt;br /&gt;
         self.outstream.write(self.lexer.error_leader()+msg+&amp;#039;\n&amp;#039;) &lt;br /&gt;
  &lt;br /&gt;
     def parse_put(self): &lt;br /&gt;
         money = self.next_money() &lt;br /&gt;
         if money: return PutCmd(&amp;#039;put&amp;#039;,arg=money)&lt;br /&gt;
         &lt;br /&gt;
     def parse_push(self): &lt;br /&gt;
         button=self.next_button() &lt;br /&gt;
         if button: return PushCmd(&amp;#039;push&amp;#039;,arg=button)&lt;br /&gt;
         &lt;br /&gt;
     def parse_verify(self):&lt;br /&gt;
         verify=self.next_verify()&lt;br /&gt;
         if verify==&amp;#039;button&amp;#039;:&lt;br /&gt;
             status=self.next_status()&lt;br /&gt;
             return VerifyButtonCmd(&amp;#039;verify&amp;#039;, arg=verify, status=status )&lt;br /&gt;
         else:&lt;br /&gt;
             money = self.next_money()&lt;br /&gt;
             return VerifyMoneyCmd(&amp;#039;verify&amp;#039;, arg=verify, amount=money )&lt;br /&gt;
 &lt;br /&gt;
     def next_status(self):&lt;br /&gt;
         tok=self.lexer.get_token()&lt;br /&gt;
         if tok not in (&amp;#039;on&amp;#039;, &amp;#039;off&amp;#039;):&lt;br /&gt;
             return self.err(&amp;#039;Unexpected button status&amp;#039;)&lt;br /&gt;
         return tok&lt;br /&gt;
     &lt;br /&gt;
     def next_verify(self):&lt;br /&gt;
         tok=self.lexer.get_token()&lt;br /&gt;
         if tok not in (&amp;#039;money&amp;#039;, &amp;#039;button&amp;#039;):&lt;br /&gt;
             return self.err(&amp;#039;Unexpected verify type&amp;#039;)&lt;br /&gt;
 #        print tok &lt;br /&gt;
         return tok&lt;br /&gt;
         &lt;br /&gt;
  &lt;br /&gt;
     def parse(self,aString=None,aStream=None,aName=None): &lt;br /&gt;
         if aString: &lt;br /&gt;
             aStream=StringIO(aString) &lt;br /&gt;
         lexer=shlex.shlex(aStream,aName) &lt;br /&gt;
         lexer.source = &amp;#039;include&amp;#039; &lt;br /&gt;
         lexer.wordchars += &amp;#039;.,-&amp;#039; &lt;br /&gt;
         self.lexer=lexer &lt;br /&gt;
         cmds = [] &lt;br /&gt;
         while 1: &lt;br /&gt;
             tok = lexer.get_token() &lt;br /&gt;
             if not tok: &lt;br /&gt;
                 break &lt;br /&gt;
             try: &lt;br /&gt;
                 parser = getattr(self,&amp;#039;parse_%s&amp;#039;%tok) &lt;br /&gt;
             except: &lt;br /&gt;
                 self.err(&amp;#039;Unknown command: &amp;#039;+tok) &lt;br /&gt;
                 continue &lt;br /&gt;
             cmd=parser()&lt;br /&gt;
             if cmd is None: &lt;br /&gt;
                 continue &lt;br /&gt;
             cmds.append(cmd) &lt;br /&gt;
         return cmds &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
 if __name__==&amp;#039;__main__&amp;#039;: &lt;br /&gt;
     err=StringIO() &lt;br /&gt;
     p=Parser(err) &lt;br /&gt;
     cmds=p.parse(&amp;quot;put 10 put 50 put 1000&amp;quot;) &lt;br /&gt;
     print cmds &lt;br /&gt;
     print `err.getvalue()`&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>