blob: de441ed8fee3528a073eb171c438637132d6ed12 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.internal.jpa.parsing.jpql;
import org.eclipse.persistence.internal.libraries.antlr.runtime.*;
import org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLLexer;
/*
* This Lexer matches in a case insensitive manner.
* This is required because starting in ANTLR v3, case insensitivity is not provided
* as an option in ANTLR and JPQL requires case insensitivity
* @author tware
*/
public class CaseInsensitiveJPQLLexer extends JPQLLexer {
public void match(String s) throws MismatchedTokenException {
int i = 0;
while ( i<s.length() ) {
int currentChar = Character.toLowerCase(input.LA(1));
int stringChar = Character.toLowerCase(s.charAt(i));
if ( currentChar != stringChar ) {
if ( state.backtracking>0 ) {
state.failed = true;
return;
}
MismatchedTokenException mte =
new MismatchedTokenException(s.charAt(i), input);
recover(mte);
throw mte;
}
i++;
input.consume();
state.failed = false;
}
}
public void match(int c) throws MismatchedTokenException {
int currentChar = Character.toLowerCase(input.LA(1));
int stringChar = Character.toLowerCase(c);
if ( currentChar != stringChar ) {
if ( state.backtracking>0 ) {
state.failed = true;
return;
}
MismatchedTokenException mte =
new MismatchedTokenException(c, input);
recover(mte);
throw mte;
}
input.consume();
state.failed = false;
}
public void matchRange(int a, int b)
throws MismatchedRangeException
{
int currentChar = Character.toLowerCase(input.LA(1));
int aChar = Character.toLowerCase(a);
int bChar = Character.toLowerCase(b);
if ( currentChar<aChar || currentChar>bChar ) {
if ( state.backtracking>0 ) {
state.failed = true;
return;
}
MismatchedRangeException mre =
new MismatchedRangeException(a,b,input);
recover(mre);
throw mre;
}
input.consume();
state.failed = false;
}
}