xref: /OpenGrok/opengrok-indexer/src/main/java/org/opengrok/indexer/analysis/JFlexStateStacker.java (revision 5d9f3aa0ca3da3a714233f987fa732f62c0965f6)
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