/* * Copyright 2010 NCHOVY * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.krakenapps.sonar.httpheaderparser.syntax; import java.text.ParseException; import org.krakenapps.bnf.Binding; import org.krakenapps.bnf.ParserContext; import org.krakenapps.bnf.Result; import org.krakenapps.bnf.Rule; import org.krakenapps.bnf.StringUtil; public class Token implements Rule { private boolean isCTL(char c) { if( 0<= (int)c && (int)c <= 31 ) return true; if( (int)c == 127 ) return true; return false; } private boolean isSeparator(char c) { if( c=='('||c==')'||c=='<'||c=='>'||c=='@'||c==','||c==';'||c==':'||c=='\\' ||c=='/'||c=='['||c==']'||c=='?'||c=='='||c=='{'||c=='}'||c==' '||c=='\t' ) return true; return false; } @Override public Result eval(String text, int position, ParserContext ctx) throws ParseException { position = StringUtil.skipSpaces(text, position); if( position >= text.length() ) throw new ParseException("end-of-text reached", position); String token = ""; int i; for( i=0 ; position + i < text.length() ; i++ ) { if( isSeparator(text.charAt(position+i)) || isCTL(text.charAt(position+i)) ) { break; } else { token = token + text.charAt(position+i); } } if( i < 1 ) throw new ParseException("cannot be a token", position); else { //System.out.println("TOKEN:"+token); return new Result(new Binding(this, token), position+token.length()); } } }