/******************************************************************************* * Copyright (c) 2004 Vlad Dumitrescu 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: * Vlad Dumitrescu *******************************************************************************/ package org.erlide.engine.services.parsing; import org.erlide.util.ErlLogger; import com.ericsson.otp.erlang.OtpErlangAtom; import com.ericsson.otp.erlang.OtpErlangLong; import com.ericsson.otp.erlang.OtpErlangObject; import com.ericsson.otp.erlang.OtpErlangRangeException; import com.ericsson.otp.erlang.OtpErlangTuple; public final class ErlToken { private static final boolean TRACE = false; public static final int KIND_OTHER = 0; public static final int KIND_WHITESPACE = 1; public static final int KIND_STRING = 2; public static final int KIND_ATOM = 3; public static final int KIND_VAR = 4; public static final int KIND_CHAR = 5; public static final int KIND_MACRO = 6; public static final int KIND_ARROW = 7; public static final int KIND_INTEGER = 8; public static final int KIND_FLOAT = 9; public static final int KIND_COMMENT = 10; public static final int KIND_KEYWORD = 11; private int kind; private int length; private int offset; private int line; // private String text; public static final ErlToken EOF = new ErlToken(KIND_OTHER); // special for lightscanstring // <<(kind_small(Kind)), L:24, O:24, G:24>> public ErlToken(final byte[] bytes, final int index, final int offset0) { kind = bytes[index]; line = int24(bytes, index + 1); offset = int24(bytes, index + 4) + offset0; length = int24(bytes, index + 7); } private int int24(final byte[] bytes, final int index) { return (0xff & bytes[index]) << 16 | (0xff & bytes[index + 1]) << 8 | 0xff & bytes[index + 2]; } public ErlToken(final OtpErlangTuple e) { // fTuple = e; if (TRACE) { ErlLogger.debug(" =" + e.toString()); } final OtpErlangObject[] parts = e.elements(); if (((OtpErlangAtom) parts[0]).atomValue().equals("token") && parts.length == 9) { // -record(token, {kind, line, offset, length, value, text}). kind = KIND_OTHER; if (parts[1] instanceof OtpErlangAtom) { final String s = ((OtpErlangAtom) parts[1]).atomValue(); if ("eof".equals(s)) { return; } else if ("ws".equals(s)) { kind = KIND_WHITESPACE; } else if ("string".equals(s)) { kind = KIND_STRING; } else if ("atom".equals(s)) { kind = KIND_ATOM; } else if ("var".equals(s)) { kind = KIND_VAR; } else if ("char".equals(s)) { kind = KIND_CHAR; } else if ("macro".equals(s)) { kind = KIND_MACRO; } else if ("->".equals(s)) { kind = KIND_ARROW; } else if ("integer".equals(s)) { kind = KIND_INTEGER; } else if ("float".equals(s)) { kind = KIND_FLOAT; } else if ("comment".equals(s)) { kind = KIND_COMMENT; } else { kind = KIND_OTHER; } } else { try { final OtpErlangLong l = (OtpErlangLong) parts[1]; kind = l.intValue(); } catch (final OtpErlangRangeException e1) { kind = KIND_OTHER; } } try { line = ((OtpErlangLong) parts[2]).intValue(); offset = ((OtpErlangLong) parts[3]).intValue(); length = ((OtpErlangLong) parts[4]).intValue(); } catch (final OtpErlangRangeException e1) { ErlLogger.warn(e1); } // value = ((OtpErlangAtom) parts[5]).atomValue(); // if (parts[6] instanceof OtpErlangString) { // text = ((OtpErlangString) parts[6]).stringValue(); // } else { // text = parts[6].toString(); // if ("undefined".equals(text) || "u".equals(text)) { // text = parts[5].toString(); // } // } // if (TRACE) { ErlLogger.debug( "mkTok " + kind + " - " + line + "/" + offset + ":" + length); // ErlLogger.debug("mkTok " + kind + " - " + text + " " + line + // "/" // + offset + ": '" + text + "' "); } } else { // {kind, line, offset, length} | {kind, line, offset, length, _} | // {kind, line, offset, length, _, _} try { kind = ((OtpErlangLong) parts[0]).intValue(); line = ((OtpErlangLong) parts[1]).intValue(); offset = ((OtpErlangLong) parts[2]).intValue(); length = ((OtpErlangLong) parts[3]).intValue(); } catch (final OtpErlangRangeException e1) { ErlLogger.warn(e1); } // value = ((OtpErlangAtom) parts[5]).atomValue(); } } // eof token private ErlToken(final int kind) { this.kind = kind; } public ErlToken(final int kind, final int offset, final int length) { this.kind = kind; } public int getKind() { return kind; } public int getLength() { return length; } public int getOffset() { return offset; } @Override public String toString() { return "{" + kind + ", " + line + "/" + offset + "+" + length + "}"; } }