<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.wcipeg.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Shunting_yard_algorithm%2Ffoo.hs</id>
		<title>Shunting yard algorithm/foo.hs - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://www.wcipeg.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Shunting_yard_algorithm%2Ffoo.hs"/>
		<link rel="alternate" type="text/html" href="http://www.wcipeg.com/wiki/index.php?title=Shunting_yard_algorithm/foo.hs&amp;action=history"/>
		<updated>2026-05-09T11:28:59Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.25.2</generator>

	<entry>
		<id>http://www.wcipeg.com/wiki/index.php?title=Shunting_yard_algorithm/foo.hs&amp;diff=1675&amp;oldid=prev</id>
		<title>Brian: Created page with &quot;&lt;syntaxhighlight lang=&quot;haskell&quot;&gt; {- Reference implementation of shunting yard algorithm. Requires: Data.Char, Data.List. This implementation is not error-tolerant; an exception w...&quot;</title>
		<link rel="alternate" type="text/html" href="http://www.wcipeg.com/wiki/index.php?title=Shunting_yard_algorithm/foo.hs&amp;diff=1675&amp;oldid=prev"/>
				<updated>2012-07-31T19:01:36Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;syntaxhighlight lang=&amp;quot;haskell&amp;quot;&amp;gt; {- Reference implementation of shunting yard algorithm. Requires: Data.Char, Data.List. This implementation is not error-tolerant; an exception w...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
{- Reference implementation of shunting yard algorithm. Requires: Data.Char, Data.List.&lt;br /&gt;
This implementation is not error-tolerant; an exception will occur on any incorrect input.&lt;br /&gt;
Note: Unary + and - have precedence higher than * and / but lower than ^. -}&lt;br /&gt;
data (Num a) =&amp;gt; Token a =&lt;br /&gt;
    Plus | Minus |&lt;br /&gt;
    Add | Subtract | Multiply | Divide | Exp |&lt;br /&gt;
    LeftParen | RightParen |&lt;br /&gt;
    Operand a&lt;br /&gt;
    &lt;br /&gt;
isLeftParen LeftParen = True; isLeftParen _ = False&lt;br /&gt;
    &lt;br /&gt;
instance (Num a) =&amp;gt; Show (Token a) where {&lt;br /&gt;
    show Plus = &amp;quot;+&amp;quot;; show Minus = &amp;quot;-&amp;quot;;&lt;br /&gt;
    show Add = &amp;quot;+&amp;quot;; show Subtract = &amp;quot;-&amp;quot;; show Multiply = &amp;quot;*&amp;quot;; show Divide = &amp;quot;/&amp;quot;; show Exp = &amp;quot;^&amp;quot;;&lt;br /&gt;
    show LeftParen = &amp;quot;(&amp;quot;; show RightParen = &amp;quot;)&amp;quot;;&lt;br /&gt;
    show (Operand x) = show x&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
prec Add = 1; prec Subtract = 1;&lt;br /&gt;
prec Multiply = 2; prec Divide = 2;&lt;br /&gt;
prec Plus = 3; prec Minus = 3;&lt;br /&gt;
prec Exp = 4;&lt;br /&gt;
prec _ = 0&lt;br /&gt;
&lt;br /&gt;
tokenize s = reverse $ f s [] where&lt;br /&gt;
    f [] l = l&lt;br /&gt;
    f ('(':s') l = f s' (LeftParen:l)&lt;br /&gt;
    f (')':s') l = f s' (RightParen:l)&lt;br /&gt;
    f ('/':s') l = f s' (Divide:l)&lt;br /&gt;
    f ('^':s') l = f s' (Exp:l)&lt;br /&gt;
    f ('+':s') l = f s' (op:l) where&lt;br /&gt;
        op = if null l || precedesUnary (head l) then Plus else Add&lt;br /&gt;
    f ('-':s') l = f s' (op:l) where&lt;br /&gt;
        op = if null l || precedesUnary (head l) then Minus else Subtract&lt;br /&gt;
    f ('*':s') l = if &amp;quot;*&amp;quot; `isPrefixOf` s' then f (tail s') (Exp:l) else f s' (Multiply:l)&lt;br /&gt;
    f s@(c:s') l&lt;br /&gt;
        | isSpace c = f (dropWhile isSpace s) l&lt;br /&gt;
        | otherwise =&lt;br /&gt;
            let (number, rest) = break (\x -&amp;gt; not (isDigit x || x == '.')) s&lt;br /&gt;
            in f rest ((Operand (read number)):l)&lt;br /&gt;
    precedesUnary LeftParen = True&lt;br /&gt;
    precedesUnary RightParen = False&lt;br /&gt;
    precedesUnary (Operand _) = False&lt;br /&gt;
    precedesUnary _ = True&lt;br /&gt;
&lt;br /&gt;
data (Num a) =&amp;gt; AST a =&lt;br /&gt;
    Leaf (Token a) |&lt;br /&gt;
    Unary (Token a) (AST a) |&lt;br /&gt;
    Binary (Token a) (AST a) (AST a)&lt;br /&gt;
    &lt;br /&gt;
instance (Num a) =&amp;gt; Show (AST a) where&lt;br /&gt;
    show (Leaf t) = show t&lt;br /&gt;
    show (Unary t a) = &amp;quot;(&amp;quot; ++ show t ++ &amp;quot; &amp;quot; ++ show a ++ &amp;quot;)&amp;quot;&lt;br /&gt;
    show (Binary t a1 a2) = &amp;quot;(&amp;quot; ++ show t ++ &amp;quot; &amp;quot; ++ show a1 ++ &amp;quot; &amp;quot; ++ show a2 ++ &amp;quot;)&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
shuntingYard l = f ([LeftParen] ++ l ++ [RightParen]) [] [] where&lt;br /&gt;
    f [] st os = head os&lt;br /&gt;
    f (Operand x : ts) st os = f ts st (Leaf (Operand x) : os)&lt;br /&gt;
    f (LeftParen:ts) st os = f ts (LeftParen:st) os&lt;br /&gt;
    f (RightParen:ts) st os = f ts (tail after) (helper before os) where&lt;br /&gt;
        (before, after) = break isLeftParen st&lt;br /&gt;
    f (Exp:ts) st os = f ts (Exp:st) os&lt;br /&gt;
    f (Plus:ts) st os = f ts (Plus:st) os&lt;br /&gt;
    f (Minus:ts) st os = f ts (Minus:st) os&lt;br /&gt;
    f (op:ts) st os = f ts (op:after) (helper before os) where&lt;br /&gt;
        (before, after) = break ((&amp;gt;) (prec op) . prec) st&lt;br /&gt;
    helper [] os = os&lt;br /&gt;
    helper (Plus:st') (o:os) = helper st' (Unary Plus o : os)&lt;br /&gt;
    helper (Minus: st') (o:os) = helper st' (Unary Minus o : os)&lt;br /&gt;
    helper (o':st') (o2:o1:os) = helper st' (Binary o' o1 o2 : os)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Brian</name></author>	</entry>

	</feed>