Mercurial > urweb
diff src/lacweb.grm @ 220:2b665e822e9a
SQL boolean operators
author | Adam Chlipala <adamc@hcoop.net> |
---|---|
date | Sat, 16 Aug 2008 17:35:28 -0400 |
parents | 5292c0113024 |
children | 79819a6346e2 |
line wrap: on
line diff
--- a/src/lacweb.grm Sat Aug 16 17:18:00 2008 -0400 +++ b/src/lacweb.grm Sat Aug 16 17:35:28 2008 -0400 @@ -86,7 +86,24 @@ val e = (EApp (e, sqlexp1), loc) val e = (EApp (e, sqlexp2), loc) in - (EApp (e, (EWild, loc)), loc) + (EApp (e, (EWild, loc)), loc) + end + +fun sql_binary (oper, sqlexp1, sqlexp2, loc) = + let + val e = (EVar (["Basis"], "sql_binary"), loc) + val e = (EApp (e, (EVar (["Basis"], "sql_" ^ oper), loc)), loc) + val e = (EApp (e, sqlexp1), loc) + in + (EApp (e, sqlexp2), loc) + end + +fun sql_unary (oper, sqlexp, loc) = + let + val e = (EVar (["Basis"], "sql_unary"), loc) + val e = (EApp (e, (EVar (["Basis"], "sql_" ^ oper), loc)), loc) + in + (EApp (e, sqlexp), loc) end %% @@ -113,7 +130,7 @@ | BEGIN_TAG of string | END_TAG of string | SELECT | FROM | AS | CWHERE - | TRUE | FALSE + | TRUE | FALSE | CAND | OR | NOT | NE | LT | LE | GT | GE %nonterm @@ -203,10 +220,13 @@ %nonassoc COLON %nonassoc DCOLON TCOLON %right COMMA +%right OR +%right CAND %nonassoc EQ NE LT LE GT GE %right ARROW LARROW %right PLUSPLUS MINUSMINUS %right STAR +%left NOT %nonassoc TWIDDLE %nonassoc DOLLAR %left DOT @@ -670,9 +690,14 @@ | sqlexp GT sqlexp (sql_compare ("gt", sqlexp1, sqlexp2, s (sqlexp1left, sqlexp2right))) | sqlexp GE sqlexp (sql_compare ("ge", sqlexp1, sqlexp2, s (sqlexp1left, sqlexp2right))) + | sqlexp CAND sqlexp (sql_binary ("and", sqlexp1, sqlexp2, s (sqlexp1left, sqlexp2right))) + | sqlexp OR sqlexp (sql_binary ("or", sqlexp1, sqlexp2, s (sqlexp1left, sqlexp2right))) + | NOT sqlexp (sql_unary ("not", sqlexp, s (NOTleft, sqlexpright))) + | LBRACE eexp RBRACE (sql_inject (#1 eexp, EWild, s (LBRACEleft, RBRACEright))) + | LPAREN sqlexp RPAREN (sqlexp) wopt : (sql_inject (EVar (["Basis"], "True"), EVar (["Basis"], "sql_bool"),