sql parser


options {
    static=false;
    IGNORE_CASE=true;
}

PARSER_BEGIN(SqlParser)
public class SqlParser {
   
    public static void main(String[] args) throws Exception {
        SqlParser parser = new SqlParser(System.in);
        parser.parse();
        System.out.println("sql is correct!");
    }
}
PARSER_END(SqlParser)

SKIP :
{
    " "
|
    "/t"
|
    "/r"
|
    "/n"
|
    "/f"
}

MORE :
{
    "//" : IN_SINGLE_LINE_COMMENT
|
    "/*" : IN_MULTI_LINE_COMMENT
}

<IN_SINGLE_LINE_COMMENT>
SPECIAL_TOKEN :
{
    <SINGLE_LINE_COMMENT : "/r" | "/n" | "/r/n"> : DEFAULT
}

<IN_MULTI_LINE_COMMENT>
SPECIAL_TOKEN :
{
    <MULTI_LINE_COMMENT : "*/"> : DEFAULT
}

<IN_SINGLE_LINE_COMMENT,IN_MULTI_LINE_COMMENT>
MORE :
{
    <~[]>
}

TOKEN :
{
    <SELECT : "select">
|
    <INSERT : "insert">
|
    <UPDATE : "update">
|
    <DELETE : "delete">
}

TOKEN :
{
    <AS : "as">
|
    <ALL : "all">
|
    <SET : "set">
|
    <FROM : "from">
|   
    <INTO : "into">
|
    <GROUP_BY : "group" ([" ","/t"])+ "by">
|
    <ORDER_BY : "order" ([" ","/t"])+ "by">
|
    <WHERE : "where">
|
    <VALUES : "values">
|
    <DISTINCT : "distinct">
}

TOKEN :
{
    <LBRACKET : "(">
|
    <RBRACKET : ")">
|
    <EQ : "=">
|
    <GT : ">=">
|
    <LT : "<=">
|
    <NE : "!=">
|
    <OR : "or">
|
    <AND : "and">
|
    <LIKE : "like">  
|
    <BETWEEN : "between">
}

TOKEN :
{
    <DOT : ".">
|
    <ID : <LETTER> (<LETTER>|<DIGIT>)*>
|
    <NUMBER: (<DIGIT>)+ (<DOT>(<DIGIT>)*)?>
|
    <#LETTER : ["a"-"z","A"-"Z","_"]>
|
    <#DIGIT : ["0"-"9"]>
|
    <STRING : "/'" (~["/'"])* ("///'")? (~["/'"])* "/'">
}

TOKEN :
{
    <STATEMENT_END : ";">
|
    <END : "!!">
}

void parse() :
{
}
{
    <SELECT>
    (<DISTINCT> | <ALL>)?
    selectResultList()
    <FROM>
    fromTables()
    where()
    (<STATEMENT_END> | <END>)
   
    |
    //only support simple insert statement
    <INSERT>
    <INTO>
    <ID>    //TABLE NAME
    <LBRACKET>
    <ID>
    (
        ","
        <ID>
    )*
    <RBRACKET>
    <VALUES>
    <LBRACKET>
    values()
    <RBRACKET>
    (<STATEMENT_END> | <END>)
   
    |
   
    <UPDATE>
    <ID>
    <SET>
    sets()
    (
    where()
    )?
    (<STATEMENT_END> | <END>)
   
    |
   
    <DELETE>
    <FROM>
    <ID>
    (
    where()
    )?
    (<STATEMENT_END> | <END>)
   
}

void selectResultList() :
{
   
}
{
    selectResult()
    (
    ","
    selectResult()
    )*
}

void selectResult() :
{
}
{
    <ID>
    (<DOT><ID>)?
    (<AS><ID>)?
}

void fromTables() :
{
}
{
    table()
    (
    ","
    table()
    )*
}

void table() :
{
}
{
    <ID>
    (<ID>)?
}

void where() :
{
}
{
    <WHERE>
    multiCondition()
    (orderBy() | groupBy())?
}

void multiCondition() :
{
}
{
    (
        condition()
        |
        "("
        condition()
        ")"
    )
    (
        (<AND> | <OR>)
        (
            condition()
            |
            "("
            condition()
            ")"
        )
    )*
}

void condition() :
{
}
{
    name()
    (
    simpleCondition()
    |
    betweenCondition()
    )
}

void simpleCondition() :
{
}
{
    (<EQ> | <GT> | <LT> | <NE> | <LIKE>)
    rightCondition()
}

void betweenCondition() :
{
}
{
    <BETWEEN>
    rightCondition()
    <AND>
    rightCondition()
}

void name() :
{
}
{
    <ID>
    (
    "."
    <ID>
    )?
}

void rightCondition() :
{
}
{
    <STRING>
|
    <NUMBER>
|
    function()
}

void function() :
{
}
{
    <ID>
    <LBRACKET>
    arguments()
    <RBRACKET>
}

void arguments() :
{
}
{
    (
    argument()
    (
    ","
    argument()
    )*
    )?
}

void argument() :
{
}
{
    <ID>
    (
        <STRING>
        |
        <NUMBER>
    )
}

void values() :
{
}
{
    value()
    (
        ","
        value()
    )*
}

void value() :
{
}
{
    <STRING>
    |
    <NUMBER>
}


void orderBy() :
{
}
{
    <ORDER_BY>
    name()
}

void groupBy() :
{
}
{
    <GROUP_BY>
    name()
}

void sets() :
{
}
{
    set()
    (
        ","
        set()
    )*
}

void set() :
{
}
{
    <ID>
    <EQ>
    rightCondition()
}
展开阅读全文

没有更多推荐了,返回首页