BNFC-meta-0.1: examples/sql/Sql.hs
{-# Language QuasiQuotes #-}
module SQL where
import Language.LBNF
compile [$cf|
antiquote "[" ":" ":]" ;
entrypoints SqlStatement,BoolExpression,Value,TableName ;
-- Statements
DeleteStatement. SqlStatement ::= "DELETE" "FROM" TableName WhereClause ;
WhereClause. WhereClause ::= "WHERE" BoolExpression;
NoWhereClause. WhereClause ::= ;
-- Names
TableName. TableName ::= LocalOrSchemaQualifiedName ;
ColumnName. ColumnName ::= LocalOrSchemaQualifiedName ;
-- Expressions
BoolOr. BoolExpression ::= BoolExpression "OR" BoolExpression1 ;
BoolAnd. BoolExpression1 ::= BoolExpression1 "AND" BoolExpression2 ;
BoolNeg. BoolExpression2 ::= "NOT" BoolExpression3 ;
BoolIsNot. BoolExpression3 ::= BoolExpression4 "IS" "NOT" TruthValue ;
BoolIs. BoolExpression3 ::= BoolExpression4 "IS" TruthValue ;
BoolVal. BoolExpression4 ::= RowValuePredicand CompOp RowValuePredicand ;
_. BoolExpression4 ::= "(" BoolExpression ")" ;
-- | <nonparenthesized value expression primary>
-- Lots of other predicates go here...
_. BoolExpression ::= BoolExpression1 ;
_. BoolExpression1 ::= BoolExpression2 ;
_. BoolExpression2 ::= BoolExpression3 ;
_. BoolExpression3 ::= BoolExpression4 ;
ValuePredicand . RowValuePredicand ::= Value ;
ColumnReferencePredicand . RowValuePredicand ::= ColumnName ;
-- <boolean value expression>
-- <explicit row value constructor>
-- <row value special case>
TRUE. TruthValue ::= "TRUE" ;
FALSE. TruthValue ::= "FALSE" ;
UNKNOWN. TruthValue ::= "UNKNOWN" ;
-- Comparison operators
EqualsOp. CompOp ::= "=" ;
NotEqualsOp. CompOp ::= "><" ;
LessThanOperator. CompOp ::= "<" ;
GreaterThanOp. CompOp ::= ">" ;
LessThanOrEqualsOp. CompOp ::= "<=" ;
GreaterThanOrEqualsOp. CompOp ::= ">=" ;
-- Data
StringValue. Value ::= String ;
IntValue. Value ::= Integer ;
DoubleValue. Value ::= Double ;
-- <datetime value expression>
-- <interval value expression>
-- <user-defined type value expression>
-- <reference value expression>
-- <collection value expression>
-- Tokens
token LocalOrSchemaQualifiedName
(letter (letter | digit)* '.')* letter (letter | digit)* ;
|]