| /******************************************************************************* |
| * Copyright (c) 2001, 2005 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jem.internal.proxy.initParser; |
| /* |
| |
| |
| */ |
| |
| import java.text.MessageFormat; |
| |
| |
| |
| public class CharLiteral extends Expression { |
| protected boolean isComplete; |
| public char value; |
| public StringBuffer valueBuffer = new StringBuffer(); |
| protected boolean isEscaped = false; |
| |
| /** |
| * constructor |
| */ |
| public CharLiteral(){ |
| } |
| |
| /** |
| * evaluate method comment. |
| */ |
| public Object evaluate() throws Exception { |
| if (valueBuffer.length() == 1) |
| return new Character(valueBuffer.charAt(0)); |
| else |
| throw new EvaluationException( |
| new IllegalArgumentException(MessageFormat.format(ProxyInitParserMessages.getString("CharTooComplicated_EXC_"), //$NON-NLS-1$ |
| new Object[] {valueBuffer.toString()}))); |
| } |
| |
| public boolean isComplete(){ |
| return isComplete; |
| } |
| /** |
| * We must evaluate ourself and return the type of the result |
| */ |
| |
| public Class getTypeClass() { |
| return Character.TYPE; |
| } |
| |
| protected String getTypeClassName() { |
| return Character.TYPE.getName(); |
| } |
| /** |
| *This string might be broken into a few tokens |
| *so we need a StringBuffer |
| */ |
| public Expression push(char[] token , char delimiter){ |
| |
| if (isEscaped) { |
| isEscaped = false; |
| if (token.length != 0) { |
| // Had an escape followed by stuff, so not a true esc for our current definition |
| valueBuffer.append(DelimiterEscape); |
| } else { |
| if (delimiter == DelimiterSingleQuote || delimiter == DelimiterEscape) |
| valueBuffer.append(delimiter); // It was a true escape. |
| else { |
| valueBuffer.append(DelimiterEscape); // If wasn't a true escape |
| valueBuffer.append(delimiter); |
| } |
| return this; |
| } |
| } |
| |
| valueBuffer.append(token); |
| |
| if (delimiter == DelimiterSingleQuote){ |
| isComplete =true; |
| return this; |
| } |
| |
| // If the delimiter is an escape character remember it so we can escape |
| // the next token, otherwise treat it as a literal |
| if (delimiter == DelimiterEscape ){ |
| isEscaped = true; |
| } else { |
| valueBuffer.append(delimiter); |
| } |
| return this; |
| } |
| |
| /** |
| * chars are primitives. |
| */ |
| public boolean isPrimitive() { |
| return true; |
| } |
| public String toString(){ |
| StringBuffer buffer = new StringBuffer(); |
| buffer.append("Char('"); //$NON-NLS-1$ |
| if ( valueBuffer != null ) { |
| buffer.append(valueBuffer.toString()); |
| } |
| buffer.append(')'); |
| return buffer.toString(); |
| } |
| |
| } |