keyword ::= WHERE SELECT FROM ; symbolic ::= GE ">=" EQ "=" LE "<=" GT ">" NE "!=" LT "<" Comma "," ; lexer INT ::= {:-?[0-9]:}; lexer ID ::= {:[a-zA-Z]+:}; ignore ::= {:[ \t\n]:}; lexer error ::= {:.:}; /* extremely simplified SQL grammar */ SelectStatement super SQLAST ::= T_Keyword_SELECT Columns T_Keyword_FROM Tables T_Keyword_WHERE WhereExpression ; {: public void accept(SQLASTvisitor visitor) { visitor.visit(this); } :} abstract Columns super SQLAST ColumnList super Columns ::= [ ColumnRecur ] Column ; {: public void accept(SQLASTvisitor visitor) { visitor.visit(this); } :} ColumnRecur super Columns ::= ColumnList T_Symbolic_Comma ; {: public void accept(SQLASTvisitor visitor) { visitor.visit(this); } :} ; Column ::= T_ID ; abstract Tables super SQLAST TableList super Tables ::= [ TableRecur ] Table; {: public void accept(SQLASTvisitor visitor) { visitor.visit(this); } :} TableRecur super Tables ::= TableList T_Symbolic_Comma ; {: public void accept(SQLASTvisitor visitor) { visitor.visit(this); } :} ; Table ::= T_ID ; abstract WhereExpression super SQLAST IntFilterExpression super WhereExpression ::= T_INT Binop Column ; {: public void accept(SQLASTvisitor visitor) { visitor.visit(this); } :} ColumnFilterExpression super WhereExpression ::= Column Binop T_INT ; {: public void accept(SQLASTvisitor visitor) { visitor.visit(this); } :} JoinExpression super WhereExpression ::= Column T_Symbolic_EQ RightColumn ; {: public void accept(SQLASTvisitor visitor) { visitor.visit(this); } :} ;