<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body text="#000000" bgcolor="#c0c0c0">
    Hi all -&nbsp; <br>
    <br>
    &nbsp;I'm poking around with Parsec and looking at getting this "toy SQL"
    parser up and running. <br>
    So, I'm keen to get feedback on whether I'm on the right track (or
    off on a siding to nowhere..... ;)&nbsp;&nbsp; )&nbsp; <br>
    This is my first Parsec grammar, so I hope you'll be gentle......
    :)&nbsp;&nbsp; <br>
    <br>
    ( Note - I've put the whereStmt in parens as I want that to be an
    optional statement. I'm not sure how <br>
    to denote that in Parsec.&nbsp; )&nbsp; <br>
    <br>
    Many thanks in advance -&nbsp; <br>
    <br>
    ** Start of code **&nbsp; <br>
    -- toysql.hs&nbsp;&nbsp; <br>
    -- This code is aimed at parsing phrases like the <br>
    -- following -&nbsp; <br>
    -- select * from mytable where city = "Sydney"; <br>
    -- select foo, bar from mytable where var1 &gt; 10; <br>
    -- select baz from mytable; <br>
    -- This code is released to the public domain.&nbsp; <br>
    -- "Share and enjoy....."&nbsp; ;)&nbsp; <br>
    <br>
    module Main where <br>
    <br>
    import Text.ParserCombinators.Parsec<br>
    <br>
    sqlStmt = do{ createStmt<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; selectStmt <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; fromStmt<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; (whereStmt) <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; semicolon&nbsp; <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>
    <br>
    createStmt = do{ CREATE <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; tablename <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; AS<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
    tablename = identifier&nbsp; <br>
    <br>
    <br>
    selectStmt = do{ SELECT <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; varStmt <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
    varStmt = star &lt;|&gt; singlevar &lt;|&gt; varlist <br>
    star = '*'&nbsp; <br>
    singlevar = identifier <br>
    varlist = sepBy singlevar (char ',')&nbsp;&nbsp; <br>
    <br>
    fromStmt = do{ FROM <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; tableStmt <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
    tableStmt = singleTablestmt &lt;|&gt; multiTablestmt <br>
    singleTablestmt = identifier <br>
    multiTablestmt = sepBy identifier (char ',')&nbsp; <br>
    <br>
    whereStmt = do{ WHERE <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; condStmt <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
    condStmt = multiCondstmt &lt;|&gt; singleCondstmt <br>
    singleCondstmt = singleCondstmtnoparens &lt;|&gt;
    singleCondstmtwithparens <br>
    <br>
    singleCondstmtnoparens = do{ <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; singlevar <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; OP <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>
    <br>
    singleCondstmtwithparens = do( <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;&nbsp; char '(' <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;&nbsp; singleCondstmtnoparens <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;&nbsp; char ')'&nbsp; <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
    multiCondstmt = sepBy singleCondstmt ( AND &lt;|&gt; OR )&nbsp; <br>
    <br>
    OP = ( '=' &lt;|&gt; '&lt;' &lt;|&gt; '&gt;' &lt;|&gt; "&lt;="
    &lt;|&gt; "&gt;=" &lt;|&gt; "!=" )&nbsp; <br>
    semicolon = char ';'<br>
    <br>
    parseSQL :: String -&gt; Either ParseError [[String]]<br>
    parseSQL input = parse sqlFile "(unknown)" input<br>
    <br>
    ** end of code ** <br>
    <br>
    <br>
  </body>
</html>