001/* 002 * Units of Measurement Reference Implementation 003 * Copyright (c) 2005-2024, Jean-Marie Dautelle, Werner Keil, Otavio Santana. 004 * 005 * All rights reserved. 006 * 007 * Redistribution and use in source and binary forms, with or without modification, 008 * are permitted provided that the following conditions are met: 009 * 010 * 1. Redistributions of source code must retain the above copyright notice, 011 * this list of conditions and the following disclaimer. 012 * 013 * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions 014 * and the following disclaimer in the documentation and/or other materials provided with the distribution. 015 * 016 * 3. Neither the name of JSR-385, Indriya nor the names of their contributors may be used to endorse or promote products 017 * derived from this software without specific prior written permission. 018 * 019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 021 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 022 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 023 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 026 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 028 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 029 */ 030/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ 031package tech.units.indriya.format; 032 033/** 034 * Describes the input token stream. 035 * 036 * @version 5.4, September 26, 2020 037 */ 038 039public final class Token { 040 041 /** 042 * The Serialization identifier for this class. Increment only if the <i>serialized</i> form of the class changes. 043 */ 044 // private static final long serialVersionUID = 2188279658897600591L; 045 046 /** 047 * An integer that describes the kind of this token. This numbering system is determined by JavaCCParser, and a table of these numbers is stored in 048 * the file ...Constants.java. 049 */ 050 public int kind; 051 052 /** The line number of the first character of this Token. */ 053 public int beginLine; 054 /** The column number of the first character of this Token. */ 055 public int beginColumn; 056 /** The line number of the last character of this Token. */ 057 public int endLine; 058 /** The column number of the last character of this Token. */ 059 public int endColumn; 060 061 /** 062 * The string image of the token. 063 */ 064 public String image; 065 066 /** 067 * A reference to the next regular (non-special) token from the input stream. If this is the last token from the input stream, or if the token 068 * manager has not read tokens beyond this one, this field is set to null. This is true only if this token is also a regular token. Otherwise, see 069 * below for a description of the contents of this field. 070 */ 071 public Token next; 072 073 /** 074 * This field is used to access special tokens that occur prior to this token, but after the immediately preceding regular (non-special) token. If 075 * there are no such special tokens, this field is set to null. When there are more than one such special token, this field refers to the last of 076 * these special tokens, which in turn refers to the next previous special token through its specialToken field, and so on until the first special 077 * token (whose specialToken field is null). The next fields of special tokens refer to other special tokens that immediately follow it (without an 078 * intervening regular token). If there is no such token, this field is null. 079 */ 080 public Token specialToken; 081 082 /** 083 * An optional attribute value of the Token. Tokens which are not used as syntactic sugar will often contain meaningful values that will be used 084 * later on by the compiler or interpreter. This attribute value is often different from the image. Any subclass of Token that actually wants to 085 * return a non-null value can override this method as appropriate. 086 */ 087 public Object getValue() { 088 return null; 089 } 090 091 /** 092 * No-argument constructor 093 */ 094 public Token() { 095 } 096 097 /** 098 * Constructs a new token for the specified Image and Kind. 099 */ 100 private Token(int kind, String image) { 101 this.kind = kind; 102 this.image = image; 103 } 104 105 /** 106 * Returns the image. 107 */ 108 public String toString() { 109 return image; 110 } 111 112 /** 113 * Returns a new Token object, by default. However, if you want, you can create and return subclass objects based on the value of ofKind. Simply add 114 * the cases to the switch for all those special cases. For example, if you have a subclass of Token called IDToken that you want to create if 115 * ofKind is ID, simply add something like : 116 * 117 * case MyParserConstants.ID : return new IDToken(ofKind, image); 118 * 119 * to the following switch statement. Then you can cast matchedToken variable to the appropriate type and use sit in your lexical actions. 120 */ 121 public static Token of(int ofKind, String image) { 122 switch (ofKind) { 123 default: 124 return new Token(ofKind, image); 125 } 126 } 127 128 public static Token of(int ofKind) { 129 return of(ofKind, null); 130 } 131 132} 133/* 134 * JavaCC - OriginalChecksum=08d08345e10cca30522247698d4478e6 (do not edit this 135 * line) 136 */