%header% GRAMMARTYPE = "LL" DESCRIPTION = "A grammar for a SELECT FROM WHERE - SQL-String" AUTHOR = "Steffen Gaede" VERSION = "2.1" DATE = "06.01.2012" LICENSE = "LGPL" COPYRIGHT = "Copyright (c) 2011 Steffen Gaede." CASESENSITIVE = "no" %tokens% COUNT = "count" MIN = "min" MAX = "max" SUM = "sum" AVG = "avg" FLAGD = "distinct" FLAGU = "unique" AND = "and" OR = "or" NOT = "not" EXISTS = "exists" selectToken = "select" fromToken = "from" whereToken = "where" groupToken = "group" orderToken = "order" byToken = "by" havingToken = "having" asToken = "as" ascToken = "asc" descToken = "desc" joinfullToken = "full" joinleftToken = "left" joinrightToken = "right" joinouterToken = "outer" joininnterToken = "inner" joinToken = "join" onToken = "on" likeToken = "like" betweenToken = "between" inToken = "in" LEFT_PAREN = "(" RIGHT_PAREN = ")" KOMMA = "," EQUAL = "=" UNEQUAL = "!=" GREATEREQUAL = ">=" GREATER = ">" LESSEREQUAL = "<=" LESSER = "<" UNEQUAL2 = "<>" DOT = "." ASTERISK = "*" PERCENT = "%" APOSTROPHE = "'" UNION = "union" //ALL = "all" NUMBER = <<[0-9]+>> ID = <<[a-z0-9_]+>> WHITESPACE = <<[ \t\n\r]+>> %ignore% %productions% // Start // {...} = (...)* // [...] = (...)? // ? = 'kann' // * = 'beliebig oft' // + = 'min 1x' SFW = SFWGOH [UNION SFW]; SFWGOH = ST FT [WT] [GBT] [OBT] [HT]; ST = selectToken S2; S2 = [FLAGDU] (ASTERISK|S3); S3 = "(" S3 ")" | (S3AS ["," S3]); S3AS = ("(" SFWGOH ")"|ReferenceAll|FUNCTION) [AS]; AS = asToken ID; FT = fromToken F1; F1 = "(" F1 ")" | ((IID | F1SFW | J1)[","F1]); F1SFW = "(" SFWGOH ")" AS; WT = whereToken W1; W1 = ("(" W1 ")" | W3W2 | WEX)[COMP2 W1]; W3W2 = W3 W2; W2 = (COMP1 W3) | C1; W3 = "(" (SFWGOH | ReferenceList) ")" | Reference | AID | NUMBER; // SubSelect geht nur mit (SFW) oder ohne Klammern, aber nicht 'vielleicht' WEX = [NOT] EXISTS "(" SFWGOH ")"; GBT = groupToken byToken ReferenceList; OBT = orderToken byToken OB; OB = Reference [scToken][","OB]; HT = havingToken H1; H1 = ((FUNCTION COMP1 H2)|(H2 COMP1 FUNCTION)) [COMP2 H1]; H2 = (NUMBER|AID) | "(" SFWGOH ")"; R1 = "(" R1 ")" | Reference "=" Reference; R2 = ("(" R2 ")" | SFWGOH | ASTERISK | Reference)[","R2]; Reference = ID | ID"."ID; ReferenceAll = Reference | ID"."ASTERISK; ReferenceList = Reference [","ReferenceList]; COMP = COMP1 | COMP2; COMP1=EQUAL|UNEQUAL|GREATEREQUAL|GREATER|LESSEREQUAL|LESSER|UNEQUAL2; COMP2 = AND | OR; FLAGDU=FLAGD|FLAGU; scToken=ascToken|descToken; jdToken=joinfullToken|joinleftToken|joinrightToken; joToken=joinouterToken|joininnterToken; J1 = IID [[jdToken] joToken] joinToken IID onToken J2; J2 = R1 [AND J2]; C1 = C1LIKE | C1BETWEEN | C1IN; C1LIKE = likeToken PID; C1BETWEEN = betweenToken (CBAID | CBNUMBER); CBAID = AID AND AID; CBNUMBER = NUMBER AND NUMBER; C1IN = [NOT] inToken "(" (C2|SFWGOH) ")"; C2 = AID ["," C2]; IID = ID [AS | ID]; PID = "%"(ID|NUMBER)"%"; AID = "'"(ID|NUMBER)"'"; FUNCTION = (FUNCTION_AGG|USERFUNCTION) "(" [R2] ")"; FUNCTION_AGG=COUNT|MIN|MAX|SUM|AVG; USERFUNCTION = ID;