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()
}
本文介绍了一个简单的SQL解析器实现,该解析器能够处理基本的SQL语句,包括SELECT、INSERT、UPDATE和DELETE等操作。文章详细展示了如何通过定义词法分析规则及语法解析逻辑来构建解析器。
2083

被折叠的 条评论
为什么被折叠?



