/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* JFlex 1.8.2 *
* Copyright (C) 1998-2018 Gerwin Klein <lsf@jflex.de> *
* All rights reserved. *
* *
* License: BSD *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
package jflex.core;
import java.util.Objects;
import jflex.exceptions.GeneratorException;
import jflex.logging.Out;
Encapsulates an action in the specification.
It stores the Java code as String together with a priority (line number in the specification).
Author: Gerwin Klein Version: JFlex 1.8.2
/**
* Encapsulates an action in the specification.
*
* <p>It stores the Java code as String together with a priority (line number in the specification).
*
* @author Gerwin Klein
* @version JFlex 1.8.2
*/
public final class Action {
A normal action /** A normal action */
public static final int NORMAL = 0;
Action of a lookahead expression r1/r2 with fixed length r1 /** Action of a lookahead expression r1/r2 with fixed length r1 */
public static final int FIXED_BASE = 1;
Action of a lookahead expression r1/r2 with fixed length r2 /** Action of a lookahead expression r1/r2 with fixed length r2 */
public static final int FIXED_LOOK = 2;
Action of a lookahead expression r1/r2 with a finite choice of fixed lengths in r2 /** Action of a lookahead expression r1/r2 with a finite choice of fixed lengths in r2 */
public static final int FINITE_CHOICE = 3;
Action of a general lookahead expression /** Action of a general lookahead expression */
public static final int GENERAL_LOOK = 4;
Action of the 2nd forward pass for lookahead /** Action of the 2nd forward pass for lookahead */
public static final int FORWARD_ACTION = 5;
Action of the backward pass for lookahead /** Action of the backward pass for lookahead */
public static final int BACKWARD_ACTION = 6;
The Java code this Action represents /** The Java code this Action represents */
public final String content;
The priority (i.e. line number in the specification) of this Action. /** The priority (i.e. line number in the specification) of this Action. */
public final int priority;
Which kind of action this is. (normal, a/b
with fixed length a, fixed length b, etc) /**
* Which kind of action this is. (normal, {@code a/b} with fixed length a, fixed length b, etc)
*/
private int kind = NORMAL;
The length of the lookahead (if fixed) /** The length of the lookahead (if fixed) */
private int len;
The entry state of the corresponding forward DFA (if general lookahead) /** The entry state of the corresponding forward DFA (if general lookahead) */
private int entryState;
Creates a new Action object with specified content and line number.
Params: - content – java code
- priority – line number
/**
* Creates a new Action object with specified content and line number.
*
* @param content java code
* @param priority line number
*/
public Action(String content, int priority) {
this.content = content.trim();
this.priority = priority;
}
Creates a new Action object of the specified kind. Only accepts FORWARD_ACTION or
BACKWARD_ACTION.
Params: - kind – the kind of action
See Also:
/**
* Creates a new Action object of the specified kind. Only accepts FORWARD_ACTION or
* BACKWARD_ACTION.
*
* @param kind the kind of action
* @see #FORWARD_ACTION
* @see #BACKWARD_ACTION
* @see #FORWARD_ACTION
* @see #BACKWARD_ACTION
*/
public Action(int kind) {
if (kind != FORWARD_ACTION && kind != BACKWARD_ACTION) throw new GeneratorException();
this.content = "";
this.priority = Integer.MAX_VALUE;
this.kind = kind;
}
Compares the priority value of this Action with the specified action.
Params: - other – the other Action to compare this Action with.
Returns: this Action if it has higher priority - the specified one, if not.
/**
* Compares the priority value of this Action with the specified action.
*
* @param other the other Action to compare this Action with.
* @return this Action if it has higher priority - the specified one, if not.
*/
public Action getHigherPriority(Action other) {
if (other == null) return this;
// the smaller the number the higher the priority
if (other.priority > this.priority) return this;
else return other;
}
@Override
public String toString() {
return "Action (priority "
+ priority
+ ", lookahead "
+ kind
+ ") :"
+ Out.NL
+ content; // $NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
Returns true
iff the parameter is an Action with the same content as this one. Params: - a – the object to compare this Action with
Returns: true if the action strings are equal
/**
* Returns {@code true} iff the parameter is an Action with the same content as this one.
*
* @param a the object to compare this Action with
* @return true if the action strings are equal
*/
public boolean isEquiv(Action a) {
return Objects.equals(this.content, a.content)
&& this.kind == a.kind
&& this.len == a.len
&& this.entryState == a.entryState;
}
@Override
public int hashCode() {
return content.hashCode();
}
@Override
public boolean equals(Object o) {
if (o instanceof Action) {
if (o == this) {
return true;
}
return isEquiv((Action) o);
} else {
return false;
}
}
Return true iff this is action belongs to a general lookahead rule.
Returns: true if this actions belongs to a general lookahead rule.
/**
* Return true iff this is action belongs to a general lookahead rule.
*
* @return true if this actions belongs to a general lookahead rule.
*/
public boolean isGenLookAction() {
return kind == GENERAL_LOOK;
}
Return true if code for this is action should be emitted, false if it is a BACK/FORWARD
lookahead action.
Returns: true if code should be emitted for this action.
/**
* Return true if code for this is action should be emitted, false if it is a BACK/FORWARD
* lookahead action.
*
* @return true if code should be emitted for this action.
*/
public boolean isEmittable() {
return kind != BACKWARD_ACTION && kind != FORWARD_ACTION;
}
Return kind of lookahead.
Returns: a int.
/**
* Return kind of lookahead.
*
* @return a int.
*/
public int lookAhead() {
return kind;
}
Sets the lookahead kind and data for this action
Params: - kind – which kind of lookahead it is
- data – the length for fixed length lookaheads.
/**
* Sets the lookahead kind and data for this action
*
* @param kind which kind of lookahead it is
* @param data the length for fixed length lookaheads.
*/
public void setLookAction(int kind, int data) {
this.kind = kind;
this.len = data;
}
The length of the lookahead or base if this is a fixed length lookahead action.
Returns: a int.
/**
* The length of the lookahead or base if this is a fixed length lookahead action.
*
* @return a int.
*/
public int getLookLength() {
return len;
}
Return the corresponding entry state for the forward DFA (if this is a general lookahead
expression)
Returns: the forward DFA entry state (+1 is the backward DFA)
/**
* Return the corresponding entry state for the forward DFA (if this is a general lookahead
* expression)
*
* @return the forward DFA entry state (+1 is the backward DFA)
*/
public int getEntryState() {
return entryState;
}
Set the corresponding entry state for the forward DFA of this action (if this is a general
lookahead expression)
Params: - entryState – a int.
/**
* Set the corresponding entry state for the forward DFA of this action (if this is a general
* lookahead expression)
*
* @param entryState a int.
*/
public void setEntryState(int entryState) {
this.entryState = entryState;
}
copyChoice.
Params: - length – a int.
Returns: a Action
object.
/**
* copyChoice.
*
* @param length a int.
* @return a {@link Action} object.
*/
public Action copyChoice(int length) {
Action a = new Action(this.content, this.priority);
a.setLookAction(FINITE_CHOICE, length);
return a;
}
String representation of the lookahead kind of this action.
Returns: the string representation
/**
* String representation of the lookahead kind of this action.
*
* @return the string representation
*/
public String lookString() {
switch (kind) {
case NORMAL:
return "";
case BACKWARD_ACTION:
return "LOOK_BACK";
case FIXED_BASE:
return "FIXED_BASE";
case FIXED_LOOK:
return "FIXED_LOOK";
case FINITE_CHOICE:
return "FINITE_CHOICE";
case FORWARD_ACTION:
return "LOOK_FORWARD";
case GENERAL_LOOK:
return "LOOK_ACTION";
default:
return "unknown lookahead type";
}
}
}