aladdinparser.jjt

来自「mysql集群」· JJT 代码 · 共 2,022 行 · 第 1/4 页

JJT
2,022
字号
				"\u1f20" - "\u1f45",
				"\u1f48" - "\u1f4d",
				"\u1f50" - "\u1f57",
				"\u1f59",
				"\u1f5b",
				"\u1f5d",
				"\u1f5f" - "\u1f7d",
				"\u1f80" - "\u1fb4",
				"\u1fb6" - "\u1fbc",
				"\u1fbe",
				"\u1fc2" - "\u1fc4",
				"\u1fc6" - "\u1fcc",
				"\u1fd0" - "\u1fd3",
				"\u1fd6" - "\u1fdb",
				"\u1fe0" - "\u1fec",
				"\u1ff2" - "\u1ff4",
				"\u1ff6" - "\u1ffc",
				"\u207f",
				"\u2102",
				"\u2107",
				"\u210a" - "\u2113",
				"\u2115",
				"\u2118" - "\u211d",
				"\u2124",
				"\u2126",
				"\u2128",
				"\u212a" - "\u2131",
				"\u2133" - "\u2138",
				"\u3005",
				"\u3031" - "\u3035",
				"\u3041" - "\u3094",
				"\u309b" - "\u309e",
				"\u30a1" - "\u30fa",
				"\u30fc" - "\u30fe",
				"\u3105" - "\u312c",
				"\u3131" - "\u318e",
				"\u4e00" - "\u9fa5",
				"\uac00" - "\ud7a3",
				"\uf900" - "\ufa2d",
				"\ufb00" - "\ufb06",
				"\ufb13" - "\ufb17",
				"\ufb1f" - "\ufb28",
				"\ufb2a" - "\ufb36",
				"\ufb38" - "\ufb3c",
				"\ufb3e",
				"\ufb40" - "\ufb41",
				"\ufb43" - "\ufb44",
				"\ufb46" - "\ufbb1",
				"\ufbd3" - "\ufd3d",
				"\ufd50" - "\ufd8f",
				"\ufd92" - "\ufdc7",
				"\ufdf0" - "\ufdfb",
				"\ufe70" - "\ufe72",
				"\ufe74",
				"\ufe76" - "\ufefc",
				"\uff21" - "\uff3a",
				"\uff41" - "\uff5a",
				"\uff66" - "\uffbe",
				"\uffc2" - "\uffc7",
				"\uffca" - "\uffcf",
				"\uffd2" - "\uffd7",
				"\uffda" - "\uffdc"
			]>
|   < #SPECIAL_CHARS: "$" | "_">
|   < STRING_LITERAL: "'" (~["'"])* "'" ("'" (~["'"])* "'")*>
|   < S_QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])* "\"" >
|	< S_COMMA_IDENTIFIER: "`" ((["@"])*( <LETTER> )+ ( <DIGIT> | "-"|<LETTER> |<SPECIAL_CHARS>)*) "`">
|   < S_PARAMETER_MARKER: "?"|":"(<DIGIT>)*>

}


Statment parse() #Statment:
{
	Expression expression = null;
	Statment statment = null;
}
{
    (((
    statment = DeleteQuery()
    |
    statment = InsertQuery()
    |
    statment= SelectQuery()
    |
    statment = UpdateQuery()
    |
    "SET" statment = PropertySetQuery(new PropertyStatment())
    |
    statment = SelectSchema()
    |(<K_COMMIT> /*[<K_WORK>] [<K_AND> [<K_NO>] <K_CHAIN>] [[<K_NO>] <K_RELEASE>]*/){statment = new CommitStatment();}
    |(<K_ROLLBACK>/*[<K_WORK>] [<K_AND> [<K_NO>] <K_CHAIN>] [[<K_NO>] <K_RELEASE>]*/){statment = new RollbackStatment();}
    |(<K_START_TRANSACTION>){statment = new StartTansactionStatment();}
    )(";"|<EOF>))
    |
    (statment = ShowQuery()))
    {
    	if(statment instanceof DMLStatment){
	    	List<Table> list = new ArrayList<Table>();
			for(Map.Entry<String,Table> entry : tableAliasMap.entrySet()){
				if(!list.contains(entry.getValue())){
					list.add(entry.getValue());
				}
			}
			
			Table[] tables = new Table[list.size()];
			list.toArray(tables);
			((DMLStatment)statment).setTables(tables);
    	}
        return statment;
    }
}
Statment SelectSchema() :{
	Token t = null;
	String schema = null;
}{
	<K_USE> (token=<STRING_LITERAL>{schema = (t.image).substring(1,t.image.length()-1);}
			|t=<S_QUOTED_IDENTIFIER>{schema = (t.image).substring(1,t.image.length()-1);}
			|t=<S_COMMA_IDENTIFIER>{schema = (t.image).substring(1,t.image.length()-1);}
			|t=<IDENTIFIER>{schema = t.image;}){
		PropertyStatment statment = new PropertyStatment();
		statment.addProperty("schema",new ConstantExpression(schema));
		return statment;
	}
}


Statment ShowQuery() :{
	Expression expression = null;
	Column column = null;
	Table table = null;
}{
	"SHOW"{return ShowStatment.STATMENT;}//[(<K_CREATE> [<K_TABLE>|<IDENTIFIER>])|<K_FULL>] column = ColumnName() [<K_FROM> table = TableReference()]{
		/**
		ColumnExpression columnExpression = new ColumnExpression();
		columnExpression.setColumn(column);
		ShowStatment show = new ShowStatment();
		show.setExpression(columnExpression);
		return show;
	}
	**/
}


Statment PropertySetQuery(PropertyStatment statment) :{
	Expression expression = null;
	
	Token name = null;
	Token valueToken = null;
	Comparable value = null;
	String propertyName = null;
}{
	([<K_SESSION> | <K_OPTION>] ((<K_TRANSACTION_ISOLATION_LEVEL>(
				<K_TRANSACTION_READ_COMMITTED>{value=Connection.TRANSACTION_READ_COMMITTED;}
				|<K_TRANSACTION_READ_UNCOMMITTED>{value=Connection.TRANSACTION_READ_UNCOMMITTED;}
				|<K_TRANSACTION_SERIALIZABLE>{value=Connection.TRANSACTION_SERIALIZABLE;}
				|<K_TRANSACTION_REPEATABLE_READ>{value=Connection.TRANSACTION_REPEATABLE_READ;}
				)){propertyName = "TRANSACTIONISOLATION";}
			|
			(<K_CLIENT_CHARSET>{propertyName = "charset";} 
				(valueToken = <IDENTIFIER> {value = valueToken.image;}
				| valueToken = <STRING_LITERAL>{value = valueToken.image;}
				|valueToken = <S_QUOTED_IDENTIFIER>{value = valueToken.image;}
				))
			|
			(name = <IDENTIFIER>{propertyName = name.image;}["." name=<IDENTIFIER>{propertyName = propertyName+"."+name.image;}] ["="] (
			valueToken= <K_NULL>{ value = "null";}
			| valueToken= <K_TRUE> {value = Boolean.TRUE;}
			| valueToken= <K_FALSE> {value = Boolean.FALSE;}
			| valueToken = <IDENTIFIER> {value = valueToken.image;}
			| valueToken = <INTEGER_LITERAL>{value = Long.valueOf(valueToken.image);} 
			| valueToken = <STRING_LITERAL>{value = valueToken.image;} //{value = valueToken.image.substring(1,token.image.length()-1);}
			| valueToken = <S_QUOTED_IDENTIFIER>{value = valueToken.image;}
			))
			))["," PropertySetQuery(statment)]{
		if(value != null){
			ConstantExpression consExp= new ConstantExpression(value);
			statment.addProperty(propertyName,consExp);
		}
		return statment;
	}
}

Statment UpdateQuery():
{
	Expression expression = null;
	Table table = null;
	DMLStatment statment = null;
}
{
   	(table = UpdateStatement()
    [expression= WhereClause() ]){
    	statment = new UpdateStatment();
    	if(expression != null){
    		if(expression instanceof BaseExpressionList){
    			if(((BaseExpressionList)expression).getSize()>0){
    				statment.setExpression(expression);
    			}
    		}else{
    			statment.setExpression(expression);
    		}
    	}
    	return statment;	
    }
}

Table UpdateStatement():
{
	Table table = null;
}
{
    ("UPDATE"
    table = TableReference()["," TableReference()]
    "SET" AssignmentClause()){
    	return table;
    }
}

Expression AssignmentClause():
{
	Expression expression = null;
}
{
       (expression= ColumnValues(){
       
       
       }
        |  (   "(" UpdateColumn() ("," UpdateColumn())* ")" "=" "(" ( LOOKAHEAD(2) UpdateValues() |  FullSelectStatement() ) ")" )
        ){
        	return expression;
        }
}

void UpdateColumn():
{}
{
    ColumnName()
}

List<Expression> UpdateValues():
{
	Expression expression = null;
	List<Expression> list = new ArrayList<Expression>();
}
{
       expression= UpdateValue(){list.add(expression);} ("," expression=UpdateValue(){list.add(expression);})*{
       	
       	return list;
       }
}

Expression UpdateValue():
{
Expression expression = null;
}
{
    expression =  SQLSimpleExpression(){
       return 	expression;
    }
}

Statment DeleteQuery():
{
	Expression expression = null;
	Table table = null;
	DMLStatment statment = null;
}
{
    (table = DeleteStatement()
    [expression = WhereClause()]){
    	statment = new DeleteStatment();
    	if(expression != null){
    		if(expression instanceof BaseExpressionList){
    			if(((BaseExpressionList)expression).getSize()>0){
    				statment.setExpression(expression);
    			}
    		}else{
    			statment.setExpression(expression);
    		}
    	}
    	return 	statment;
    }
}

Table DeleteStatement():
{
	Table table = null;
}
{
    "DELETE" ["FROM"] table = TableReference(){
    	return table;	
    }
}


Statment InsertQuery():
{
	Table table = null;
	DMLStatment statment = new InsertStatment();
	Expression expression = null;
	List<Column> insertColumns = null;
	List<Expression> insertValues = null;
}
{
    (<K_INSERT>|<K_REPLACE>) ["INTO"] table = TableName() ([LOOKAHEAD(4) "(" insertColumns = InsertColumns() ")"]
    ( insertValues = InsertValues() | expression = FullSelectStatement())
    {
    	if(insertValues == null){
    		if(expression != null){
				if(expression instanceof BaseExpressionList){
					if(((BaseExpressionList)expression).getSize()>0){
						statment.setExpression(expression);
					}
				}else{
					statment.setExpression(expression);
				}
			}
    	}else{
    		if(insertColumns != null){
	    		AndExpression andExpression = new AndExpression();
	    		int index = 0;
	    		for(Column column:insertColumns){
	    			ColumnExpression colExpression = new ColumnExpression();
	    			colExpression.setColumn(column);
	    			ComparisonExpression compExp = new ComparisonExpression();
	    			compExp.setComparison(Comparative.Equivalent);
	    			compExp.setExpression(insertValues.get(index));
	    			colExpression.setExpression(compExp);
	    			andExpression.addExpression(colExpression);
	    			index ++;
	    		}

    			if(andExpression.getSize()>0){
    				statment.setExpression(andExpression);
    			}
    		}
    	}
    	
    } | "SET" expression = AssignmentClause(){
	    	if(expression != null){
	    		if(expression instanceof BaseExpressionList){
	    			if(((BaseExpressionList)expression).getSize()>0){
	    				statment.setExpression(expression);
	    			}
	    		}else{
	    			statment.setExpression(expression);
	    		}
	    	}
    	}){
    	return statment;
    }
}


List<Column> InsertColumns() #void:
{
	List<Column> insertColumns = new ArrayList<Column>();
	Column column = null;
}
{
        (column = InsertColumn(){insertColumns.add(column);} ("," column = InsertColumn(){insertColumns.add(column);})*){
        	return insertColumns;
        }
}

//This is just a wrapper to provide different formatting in case of Insert
Column InsertColumn():
{
	Column column = null;
}
{
   column = ColumnName(){
   		return column;
   }
}

List<Expression> InsertValues():
{
	List<Expression> insertValues = new ArrayList<Expression>();
	Expression expression = null;
}
{
       ("VALUES" "("  expression = InsertValue(){insertValues.add(expression);} ("," expression = InsertValue(){insertValues.add(expression);})*  ")"){
       	return insertValues;
       }
}

//This is just a wrapper to provide different formatting in case of Insert
Expression InsertValue():
{
	Expression expression = null;
}
{
 	expression = SQLSimpleExpression(){
 		return expression;	
 	}
}


Statment SelectQuery():
{
	Expression expression = null;
	DMLStatment statment = null;
}
{
   (expression = FullSelectStatement()
    (ExtraClauses())*)
    {
    	statment = new SelectStatment();
    	if(expression != null){
    		if(expression instanceof BaseExpressionList){
    			if(((BaseExpressionList)expression).getSize()>0){
    				statment.setExpression(expression);
    			}
    		}else{
    			statment.setExpression(expression);
    		}
    	}
    	return statment;
    }
    
}


Expression ColumnValues() #void:
{
	Expression expression = null;
	AndExpression andExpression = new AndExpression();
}
{
 (expression= ColumnValue(){if(expression != null) andExpression.addExpression(expression);} ("," expression = ColumnValue(){if(expression != null) andExpression.addExpression(expression);})*){
  return andExpression;
 }
}

Expression ColumnValue() #void :
{
ColumnExpression colExpression = new ColumnExpression();
Expression expression = null;
Column column = null;
}
{
       (column= ColumnName() "=" expression = UpdatedValue()){
       	if(expression == null) return null;
       	
       	colExpression.setColumn(column);
       	ComparisonExpression compExp = new ComparisonExpression();
		compExp.setComparison(Comparative.Equivalent);
		compExp.setExpression(expression);
		colExpression.setExpression(compExp);
       	return colExpression;
       }
}


Expression UpdatedValue() #void: // Can be a subquery or a expression
{
Expression expression = null;
}
{
  (LOOKAHEAD(("(")+ "SELECT")
  "(" expression = SubSelectStatement() ")"
  |
  expression= SQLSimpleExpression()){
  	return expression;
  }
}


ComparisonExpression IsNullClause() #void:
{
	int comparison = Comparative.Equivalent;
}
{
    (<K_IS> [<K_NOT>{comparison = Comparative.NotEquivalent;}] <K_NULL>)
    {
    	ComparisonExpression comparativeExpression = new ComparisonExpression();
		comparativeExpression.setComparison(comparison);
		comparativeExpression.setExpression(new ConstantExpression(null));	
		return comparativeExpression;
    }
}



/*
*	Tabel Column
*/
Column ColumnName() #void:
{
	String schemaName = null;
	String tableName = null;
	String columnName = null;
	Column column =  new Column();
	Table table = null;
}
{
    // schema.table.column
   schemaName = EntityName() [ "." tableName = EntityName() ["." columnName = EntityName()]]{
	   	if(tableName == null){
	   		columnName = schemaName;
	   		schemaName = null;
	   		if(tableStack.size()>0){
	   			table = tableStack.peek();
	   		}
	   	}else{

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?