summaryrefslogtreecommitdiff
path: root/src/lacweb.grm
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2008-08-14 13:59:11 -0400
committerGravatar Adam Chlipala <adamc@hcoop.net>2008-08-14 13:59:11 -0400
commit14fbe79a3735e547f03cd8e95ca925fbdbb1841a (patch)
treef5b06cb6a023562572622c9b10d66f5265ee1518 /src/lacweb.grm
parent25658a4755c86ffbda946fb8b97f882f3ce7a724 (diff)
Parsing the simplest SQL query
Diffstat (limited to 'src/lacweb.grm')
-rw-r--r--src/lacweb.grm34
1 files changed, 30 insertions, 4 deletions
diff --git a/src/lacweb.grm b/src/lacweb.grm
index 0ca7298d..3920fcf9 100644
--- a/src/lacweb.grm
+++ b/src/lacweb.grm
@@ -31,8 +31,8 @@ open Source
val s = ErrorMsg.spanOf
-fun uppercaseFirst "" = ""
- | uppercaseFirst s = str (Char.toUpper (String.sub (s, 0))) ^ String.extract (s, 1, NONE)
+fun capitalize "" = ""
+ | capitalize s = str (Char.toUpper (String.sub (s, 0))) ^ String.extract (s, 1, NONE)
fun entable t =
case #1 t of
@@ -62,6 +62,8 @@ fun entable t =
| NOTAGS of string
| BEGIN_TAG of string | END_TAG of string
+ | SELECT | FROM | AS
+
%nonterm
file of decl list
| decls of decl list
@@ -120,6 +122,11 @@ fun entable t =
| attr of con * exp
| attrv of exp
+ | query of exp
+ | tables of (con * exp) list
+ | tname of con
+ | table of con * exp
+
%verbose (* print summary of errors *)
%pos int (* positions *)
%start file
@@ -390,6 +397,7 @@ eterm : LPAREN eexp RPAREN (#1 eexp, s (LPARENleft, RPARENright))
| XML_BEGIN XML_END (EApp ((EVar (["Basis"], "cdata"), s (XML_BEGINleft, XML_ENDright)),
(EPrim (Prim.String ""), s (XML_BEGINleft, XML_ENDright))),
s (XML_BEGINleft, XML_ENDright))
+ | LPAREN query RPAREN (query)
idents : ident ([ident])
| ident DOT idents (ident :: idents)
@@ -488,9 +496,27 @@ tagHead: BEGIN_TAG (let
attrs : ([])
| attr attrs (attr :: attrs)
-attr : SYMBOL EQ attrv ((CName (uppercaseFirst SYMBOL), s (SYMBOLleft, SYMBOLright)), attrv)
-
+attr : SYMBOL EQ attrv ((CName (capitalize SYMBOL), s (SYMBOLleft, SYMBOLright)), attrv)
+
attrv : INT (EPrim (Prim.Int INT), s (INTleft, INTright))
| FLOAT (EPrim (Prim.Float FLOAT), s (FLOATleft, FLOATright))
| STRING (EPrim (Prim.String STRING), s (STRINGleft, STRINGright))
| LBRACE eexp RBRACE (eexp)
+
+query : SELECT STAR FROM tables (let
+ val loc = s (SELECTleft, tablesright)
+ in
+ (EApp ((EVar (["Basis"], "sql_query"), loc),
+ (ERecord tables, loc)), loc)
+ end)
+
+tables : table ([table])
+ | table COMMA tables (table :: tables)
+
+tname : CSYMBOL (CName CSYMBOL, s (CSYMBOLleft, CSYMBOLright))
+ | LBRACE cexp RBRACE (cexp)
+
+table : SYMBOL ((CName (capitalize SYMBOL), s (SYMBOLleft, SYMBOLright)),
+ (EVar ([], SYMBOL), s (SYMBOLleft, SYMBOLright)))
+ | SYMBOL AS tname (tname, (EVar ([], SYMBOL), s (SYMBOLleft, SYMBOLright)))
+ | LBRACE eexp RBRACE AS tname (tname, eexp)