/******************************************************************************* | |
* 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; | |
} | |
} |