1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * See LICENSE.txt included in this distribution for the specific 9 * language governing permissions and limitations under the License. 10 * 11 * When distributing Covered Code, include this CDDL HEADER in each 12 * file and include the License file at LICENSE.txt. 13 * If applicable, add the following below this CDDL HEADER, with the 14 * fields enclosed by brackets "[]" replaced with your own identifying 15 * information: Portions Copyright [yyyy] [name of copyright owner] 16 * 17 * CDDL HEADER END 18 */ 19 20 /* 21 * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. 22 * Portions Copyright (c) 2011, Jens Elkner. 23 * Portions Copyright (c) 2017, Chris Fraire <cfraire@me.com>. 24 */ 25 package org.opengrok.indexer.analysis; 26 27 import java.io.IOException; 28 import java.util.Stack; 29 30 /** 31 * Represents an abstract base class for resettable lexers that need to track 32 * a state stack. 33 */ 34 public abstract class JFlexStateStacker implements Resettable, 35 JFlexStackingLexer { 36 37 protected final Stack<Integer> stack = new Stack<>(); 38 39 protected int lineNumber = 1; 40 41 /** 42 * Resets the instance using {@link #clearStack()}, and sets line number to 43 * one. 44 */ reset()45 public void reset() { 46 clearStack(); 47 setLineNumber(1); 48 } 49 50 /** 51 * Saves current {@link #yystate()} to stack, and enters the specified 52 * {@code newState} with {@link #yybegin(int)}. 53 * @param newState state id 54 */ yypush(int newState)55 public void yypush(int newState) { 56 this.stack.push(yystate()); 57 yybegin(newState); 58 } 59 60 /** 61 * Pops the last state from the stack, and enters the state with 62 * {@link #yybegin(int)}. 63 * @throws IOException if any error occurs while effecting the pop 64 */ yypop()65 public void yypop() throws IOException { 66 yybegin(this.stack.pop()); 67 } 68 69 /** 70 * Calls {@link #clearStack()}, and enters the specified {@code newState} 71 * with {@link #yybegin(int)}. 72 * @param newState state id 73 */ yyjump(int newState)74 public void yyjump(int newState) { 75 clearStack(); 76 yybegin(newState); 77 } 78 79 /** 80 * Gets the YYEOF value. 81 * @return YYEOF 82 */ getYYEOF()83 public abstract int getYYEOF(); 84 85 /** 86 * Gets the line number. Default value is 1. 87 */ getLineNumber()88 public int getLineNumber() { 89 return lineNumber; 90 } 91 92 /** 93 * Tests if the instance's state stack is empty. 94 * @return {@code true} if the stack contains no items; {@code false} 95 * otherwise. 96 */ emptyStack()97 public boolean emptyStack() { 98 return stack.empty(); 99 } 100 101 /** 102 * Sets the line number. 103 */ setLineNumber(int value)104 protected void setLineNumber(int value) { 105 lineNumber = value; 106 } 107 108 /** 109 * Clears the instance stack. 110 */ clearStack()111 protected void clearStack() { 112 stack.clear(); 113 } 114 } 115