|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES All Classes | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectptolemy.data.expr.PtParser
public class PtParser
This file implements an expression parser for Ptolemy II using the JavaCC parser generator. It can handle all the basic arithmetic operators (*, /, +, -, %, ^), relational operators (<, <=, >, >=, == !=), logical operators(&&, ||, !), bitwise operators (&, |, #, ~) and, using reflection, all of the functionality available in the java.lang.Math package.
By editing the ASTFunctionNode file it is also relatively easy to allow references to other functions. This provides an easy mechanism to extend the range to the parser e.g. have a tcl(...) function that passes the string to a Tcl interpreter and retuns the result.
Functional if is supported via the following syntax: (boolean) ? (value1) : (value2)
Extensibility is also supported by allowing method calls on the Tokens, the syntax is (value1).method(comma separated arguments)
JavaCC by itself simply generates a file (and support files) that allow an input to be parsed, it does not return a parse tree. For the purposes of type checking we require a parse tree, and this is obtained using JJTree, a preprocessor for JavaCC.
JJtree operates by annotating the grammar file to support the generation of the parse tree. Thus the process is
The parser can also be passed a symbol table of ptolemy.data.expr.Variables which the expression to be parsed can reference.
Anything between quotes(") or apostrophes(') is taken to be one string. Strings are allowed to contain newlines or carriage returns. In addition, these characters, as well as other special characters, can be escaped using the standard Java syntax (\n, \t, \077, etc.).
The expressions recognized follow as close as possible the syntax of Java. In particular the operator precedences implemented here follow exactly those in Java. Any type conversions that are performed are lossless. If the user wants lossy conversions, explicit casts will be necessary.
Complex number are specified by an i or j after the imaginary part of the number. Long numbers are specified by an l or L after an integer number.
Users can register constants with the parser and also register classes where functions that may be called are defined. For a more thorough description of what the Parser is designed to do, please consult the Ptolemy II design document (or contact nsmyth@eecs)
Note that the parsers created by JavaCC generally have quite a bit of internal state. On the other hand, the parse trees generated by this parser are much smaller. It is also fairly cheap to traverse a parse tree in order to evaluate it. Thus it is usually preferable to cache parse trees and create a new parser when the cached parse tree becomes invalid.
ASTPtBitwiseNode
,
ASTPtFunctionApplicationNode
,
ASTPtFunctionDefinitionNode
,
ASTPtFunctionalIfNode
,
ASTPtLeafNode
,
ASTPtLogicalNode
,
ASTPtMethodCallNode
,
ASTPtProductNode
,
ASTPtRelationalNode
,
ASTPtRootNode
,
ASTPtSumNode
,
ASTPtUnaryNode
,
Token
Yellow (yuhong) |
Yellow (nsmyth) |
Nested Class Summary | |
---|---|
(package private) static class |
PtParser.JJCalls
|
private static class |
PtParser.LookaheadSuccess
|
Field Summary | |
---|---|
private static boolean |
_alreadyInitialized
|
private static java.util.List |
_classesSearched
|
(package private) boolean |
debug
|
private PtParser.JJCalls[] |
jj_2_rtns
|
private int |
jj_endpos
|
private java.util.Vector |
jj_expentries
|
private int[] |
jj_expentry
|
private int |
jj_gc
|
private int |
jj_gen
|
(package private) SimpleCharStream |
jj_input_stream
|
private int |
jj_kind
|
private int |
jj_la
|
private int[] |
jj_la1
|
private static int[] |
jj_la1_0
|
private static int[] |
jj_la1_1
|
private static int[] |
jj_la1_2
|
private Token |
jj_lastpos
|
private int[] |
jj_lasttokens
|
private PtParser.LookaheadSuccess |
jj_ls
|
Token |
jj_nt
|
private int |
jj_ntk
|
private boolean |
jj_rescan
|
private Token |
jj_scanpos
|
private boolean |
jj_semLA
|
protected JJTPtParserState |
jjtree
|
boolean |
lookingAhead
|
Token |
token
|
PtParserTokenManager |
token_source
|
Fields inherited from interface ptolemy.data.expr.PtParserConstants |
---|
AND, BITWISE_NOT, BOOL_NOT, BOOLEAN, CLOSEBRACE, CLOSEBRACKET, CLOSEPAREN, CLOSEUNION, COLON, COMMA, COMPLEX, COND_AND, COND_OR, DECIMAL_LITERAL, DEFAULT, DIVIDE, DOUBLE, EOF, EQUALS, ERROR, EXPONENT, FUNCTION, GT, GTE, HEX_LITERAL, ID, INTEGER, INTEGER_FORMAT_SPEC, LETTER, LSHR, LT, LTE, MINUS, MODULO, MULTI_LINE_COMMENT, MultiLineCommentMode, MULTIPLY, NOTEQUALS, OCTAL_LITERAL, OPENBRACE, OPENBRACKET, OPENPAREN, OPENUNION, OR, PERIOD, PLUS, POWER, QUESTION, SEPARATOR, SETEQUALS, SHL, SHR, SINGLE_LINE_COMMENT, SingleLineCommentMode, SMBRACE, SMDOLLAR, SMDOLLARBRACE, SMDOLLARPAREN, SMID, SMIDBRACE, SMIDPAREN, SMLETTER, SMPAREN, SMSTRING, STRING, StringMode, StringModeIDBrace, StringModeIDNone, StringModeIDParen, tokenImage, XOR |
Constructor Summary | |
---|---|
PtParser()
|
|
PtParser(java.io.InputStream stream)
|
|
PtParser(java.io.InputStream stream,
java.lang.String encoding)
|
|
PtParser(PtParserTokenManager tm)
|
|
PtParser(java.io.Reader stream)
|
Method Summary | |
---|---|
private void |
_initialize()
Initialize the static variable containing the classes searched by the parser upon encountering a function call. |
void |
arrayConstruct()
|
void |
assignment()
|
void |
assignmentIdentifier()
|
void |
bitwiseAnd()
|
void |
bitwiseOr()
|
void |
bitwiseXor()
|
void |
disable_tracing()
|
void |
element()
|
void |
enable_tracing()
|
void |
expression()
|
void |
funcIf()
|
void |
function()
|
void |
functionDefinition()
|
java.util.Map |
generateAssignmentMap(java.lang.String stringIn)
Generates a parse tree from the given String. |
ParseException |
generateParseException()
|
ASTPtRootNode |
generateParseTree(java.lang.String stringIn)
Generates a parse tree from the given String. |
ASTPtRootNode |
generateSimpleAssignmentParseTree(java.lang.String stringIn)
Generates a parse tree from the given String, which may optionally contain an assignment. |
ASTPtRootNode |
generateStringParseTree(java.lang.String stringIn)
Generates a parse tree from the given String, which is interpreted in "String Mode" instead of as an operator expression. |
Token |
getNextToken()
|
static java.util.List |
getRegisteredClasses()
Return the list of classes the parser searches when a function call is encountered. |
Token |
getToken(int index)
|
java.util.LinkedList |
getUndefinedList(java.lang.String stringIn)
Deprecated. Use a visitor with a ParseTreeFreeVariableCollector instead. |
void |
identifier()
|
void |
integer()
|
private boolean |
jj_2_1(int xla)
|
private boolean |
jj_2_10(int xla)
|
private boolean |
jj_2_11(int xla)
|
private boolean |
jj_2_12(int xla)
|
private boolean |
jj_2_13(int xla)
|
private boolean |
jj_2_14(int xla)
|
private boolean |
jj_2_15(int xla)
|
private boolean |
jj_2_16(int xla)
|
private boolean |
jj_2_2(int xla)
|
private boolean |
jj_2_3(int xla)
|
private boolean |
jj_2_4(int xla)
|
private boolean |
jj_2_5(int xla)
|
private boolean |
jj_2_6(int xla)
|
private boolean |
jj_2_7(int xla)
|
private boolean |
jj_2_8(int xla)
|
private boolean |
jj_2_9(int xla)
|
private boolean |
jj_3_1()
|
private boolean |
jj_3_10()
|
private boolean |
jj_3_11()
|
private boolean |
jj_3_12()
|
private boolean |
jj_3_13()
|
private boolean |
jj_3_14()
|
private boolean |
jj_3_15()
|
private boolean |
jj_3_16()
|
private boolean |
jj_3_2()
|
private boolean |
jj_3_3()
|
private boolean |
jj_3_4()
|
private boolean |
jj_3_5()
|
private boolean |
jj_3_6()
|
private boolean |
jj_3_7()
|
private boolean |
jj_3_8()
|
private boolean |
jj_3_9()
|
private boolean |
jj_3R_25()
|
private boolean |
jj_3R_26()
|
private boolean |
jj_3R_27()
|
private boolean |
jj_3R_28()
|
private boolean |
jj_3R_29()
|
private boolean |
jj_3R_30()
|
private boolean |
jj_3R_31()
|
private boolean |
jj_3R_32()
|
private boolean |
jj_3R_33()
|
private boolean |
jj_3R_34()
|
private boolean |
jj_3R_35()
|
private boolean |
jj_3R_36()
|
private boolean |
jj_3R_37()
|
private boolean |
jj_3R_38()
|
private boolean |
jj_3R_39()
|
private boolean |
jj_3R_40()
|
private boolean |
jj_3R_41()
|
private boolean |
jj_3R_42()
|
private boolean |
jj_3R_43()
|
private boolean |
jj_3R_44()
|
private boolean |
jj_3R_45()
|
private boolean |
jj_3R_46()
|
private boolean |
jj_3R_47()
|
private boolean |
jj_3R_48()
|
private boolean |
jj_3R_49()
|
private boolean |
jj_3R_50()
|
private boolean |
jj_3R_51()
|
private boolean |
jj_3R_52()
|
private boolean |
jj_3R_53()
|
private boolean |
jj_3R_54()
|
private boolean |
jj_3R_55()
|
private boolean |
jj_3R_56()
|
private boolean |
jj_3R_57()
|
private boolean |
jj_3R_58()
|
private boolean |
jj_3R_59()
|
private boolean |
jj_3R_60()
|
private boolean |
jj_3R_61()
|
private boolean |
jj_3R_62()
|
private boolean |
jj_3R_63()
|
private boolean |
jj_3R_64()
|
private boolean |
jj_3R_65()
|
private boolean |
jj_3R_66()
|
private boolean |
jj_3R_67()
|
private boolean |
jj_3R_68()
|
private boolean |
jj_3R_69()
|
private boolean |
jj_3R_70()
|
private void |
jj_add_error_token(int kind,
int pos)
|
private Token |
jj_consume_token(int kind)
|
private static void |
jj_la1_0()
|
private static void |
jj_la1_1()
|
private static void |
jj_la1_2()
|
private int |
jj_ntk()
|
private void |
jj_rescan_token()
|
private void |
jj_save(int index,
int xla)
|
private boolean |
jj_scan_token(int kind)
|
void |
logicalAnd()
|
void |
logicalEquals()
|
void |
logicalOr()
|
void |
matrixConstruct()
|
void |
nilArrayConstruct()
|
void |
optTypeSpecifier()
|
void |
orderedRecordConstruct()
|
void |
power()
|
void |
primaryElement()
|
void |
recordConstruct()
|
static void |
registerConstant(java.lang.String name,
java.lang.Object value)
Add a constant to the list of constants that the parser recognizes. |
static void |
registerFunctionClass(java.lang.String newClassName)
Add a class to the list of classes that the parser searches when a function call is encountered. |
void |
ReInit(java.io.InputStream stream)
|
void |
ReInit(java.io.InputStream stream,
java.lang.String encoding)
|
void |
ReInit(PtParserTokenManager tm)
|
void |
ReInit(java.io.Reader stream)
|
void |
relational()
|
void |
shift()
|
ASTPtRootNode |
start()
|
java.util.Map |
startAssignmentList()
|
ASTPtRootNode |
startSimpleAssignment()
|
ASTPtRootNode |
startString()
|
void |
stringModeElement()
|
void |
stringModeString()
|
void |
sum()
|
void |
term()
|
void |
unary()
|
void |
unionConstruct()
|
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
protected JJTPtParserState jjtree
boolean debug
private static boolean _alreadyInitialized
private static java.util.List _classesSearched
public PtParserTokenManager token_source
SimpleCharStream jj_input_stream
public Token token
public Token jj_nt
private int jj_ntk
private Token jj_scanpos
private Token jj_lastpos
private int jj_la
public boolean lookingAhead
private boolean jj_semLA
private int jj_gen
private final int[] jj_la1
private static int[] jj_la1_0
private static int[] jj_la1_1
private static int[] jj_la1_2
private final PtParser.JJCalls[] jj_2_rtns
private boolean jj_rescan
private int jj_gc
private final PtParser.LookaheadSuccess jj_ls
private java.util.Vector jj_expentries
private int[] jj_expentry
private int jj_kind
private int[] jj_lasttokens
private int jj_endpos
Constructor Detail |
---|
public PtParser()
public PtParser(java.io.InputStream stream)
public PtParser(java.io.InputStream stream, java.lang.String encoding)
public PtParser(java.io.Reader stream)
public PtParser(PtParserTokenManager tm)
Method Detail |
---|
public java.util.LinkedList getUndefinedList(java.lang.String stringIn) throws IllegalActionException
stringIn
- The expression to be parsed
IllegalActionException
- If the parse fails.public ASTPtRootNode generateParseTree(java.lang.String stringIn) throws IllegalActionException
stringIn
- The expression to be parsed.
IllegalActionException
- If the parse fails.public ASTPtRootNode generateSimpleAssignmentParseTree(java.lang.String stringIn) throws IllegalActionException
stringIn
- The expression to be parsed.
IllegalActionException
- If the parse fails.public ASTPtRootNode generateStringParseTree(java.lang.String stringIn) throws IllegalActionException
stringIn
- The expression to be parsed.
IllegalActionException
- If the parse fails.public java.util.Map generateAssignmentMap(java.lang.String stringIn) throws IllegalActionException
stringIn
- The expression to be parsed.
IllegalActionException
- If the parse fails.public static java.util.List getRegisteredClasses()
public static void registerConstant(java.lang.String name, java.lang.Object value) throws java.lang.IllegalArgumentException
name
- The string name that the parser will recognize.value
- An Object constraining the value associated with
the constant.
java.lang.IllegalArgumentException
- If the constant cannot
be registered with the parser.public static void registerFunctionClass(java.lang.String newClassName) throws java.lang.IllegalArgumentException
newClassName
- The fully qualified name of the Class to
be added to the search path for functions.
java.lang.IllegalArgumentException
- If the Class named by the
argument cannot not be found.private void _initialize()
public final ASTPtRootNode startSimpleAssignment() throws ParseException
ParseException
public final java.util.Map startAssignmentList() throws ParseException
ParseException
public final void assignment() throws ParseException
ParseException
public final ASTPtRootNode startString() throws ParseException
ParseException
public final void stringModeElement() throws ParseException
ParseException
public final void stringModeString() throws ParseException
ParseException
public final ASTPtRootNode start() throws ParseException
ParseException
public final void expression() throws ParseException
ParseException
public final void funcIf() throws ParseException
ParseException
public final void logicalOr() throws ParseException
ParseException
public final void logicalAnd() throws ParseException
ParseException
public final void bitwiseOr() throws ParseException
ParseException
public final void bitwiseXor() throws ParseException
ParseException
public final void bitwiseAnd() throws ParseException
ParseException
public final void logicalEquals() throws ParseException
ParseException
public final void power() throws ParseException
ParseException
public final void relational() throws ParseException
ParseException
public final void shift() throws ParseException
ParseException
public final void sum() throws ParseException
ParseException
public final void term() throws ParseException
ParseException
public final void unary() throws ParseException
ParseException
public final void element() throws ParseException
ParseException
public final void integer() throws ParseException
ParseException
public final void primaryElement() throws ParseException
ParseException
public final void functionDefinition() throws ParseException
ParseException
public final void optTypeSpecifier() throws ParseException
ParseException
public final void function() throws ParseException
ParseException
public final void assignmentIdentifier() throws ParseException
ParseException
public final void identifier() throws ParseException
ParseException
public final void matrixConstruct() throws ParseException
ParseException
public final void recordConstruct() throws ParseException
ParseException
public final void orderedRecordConstruct() throws ParseException
ParseException
public final void unionConstruct() throws ParseException
ParseException
public final void arrayConstruct() throws ParseException
ParseException
public final void nilArrayConstruct() throws ParseException
ParseException
private final boolean jj_2_1(int xla)
private final boolean jj_2_2(int xla)
private final boolean jj_2_3(int xla)
private final boolean jj_2_4(int xla)
private final boolean jj_2_5(int xla)
private final boolean jj_2_6(int xla)
private final boolean jj_2_7(int xla)
private final boolean jj_2_8(int xla)
private final boolean jj_2_9(int xla)
private final boolean jj_2_10(int xla)
private final boolean jj_2_11(int xla)
private final boolean jj_2_12(int xla)
private final boolean jj_2_13(int xla)
private final boolean jj_2_14(int xla)
private final boolean jj_2_15(int xla)
private final boolean jj_2_16(int xla)
private final boolean jj_3_9()
private final boolean jj_3R_40()
private final boolean jj_3R_41()
private final boolean jj_3R_56()
private final boolean jj_3_8()
private final boolean jj_3R_55()
private final boolean jj_3R_54()
private final boolean jj_3R_32()
private final boolean jj_3R_69()
private final boolean jj_3R_53()
private final boolean jj_3R_66()
private final boolean jj_3R_52()
private final boolean jj_3R_38()
private final boolean jj_3R_45()
private final boolean jj_3R_31()
private final boolean jj_3R_67()
private final boolean jj_3R_50()
private final boolean jj_3R_49()
private final boolean jj_3R_51()
private final boolean jj_3R_37()
private final boolean jj_3_16()
private final boolean jj_3R_30()
private final boolean jj_3R_65()
private final boolean jj_3_1()
private final boolean jj_3_2()
private final boolean jj_3R_68()
private final boolean jj_3R_36()
private final boolean jj_3R_62()
private final boolean jj_3R_28()
private final boolean jj_3_3()
private final boolean jj_3R_64()
private final boolean jj_3R_35()
private final boolean jj_3R_26()
private final boolean jj_3_4()
private final boolean jj_3R_70()
private final boolean jj_3R_48()
private final boolean jj_3R_61()
private final boolean jj_3R_39()
private final boolean jj_3R_27()
private final boolean jj_3_5()
private final boolean jj_3R_25()
private final boolean jj_3_7()
private final boolean jj_3_6()
private final boolean jj_3R_44()
private final boolean jj_3R_34()
private final boolean jj_3_15()
private final boolean jj_3R_47()
private final boolean jj_3R_46()
private final boolean jj_3_14()
private final boolean jj_3R_29()
private final boolean jj_3R_43()
private final boolean jj_3_13()
private final boolean jj_3R_60()
private final boolean jj_3R_42()
private final boolean jj_3_12()
private final boolean jj_3R_63()
private final boolean jj_3R_59()
private final boolean jj_3_11()
private final boolean jj_3R_33()
private final boolean jj_3R_58()
private final boolean jj_3_10()
private final boolean jj_3R_57()
private static void jj_la1_0()
private static void jj_la1_1()
private static void jj_la1_2()
public void ReInit(java.io.InputStream stream)
public void ReInit(java.io.InputStream stream, java.lang.String encoding)
public void ReInit(java.io.Reader stream)
public void ReInit(PtParserTokenManager tm)
private final Token jj_consume_token(int kind) throws ParseException
ParseException
private final boolean jj_scan_token(int kind)
public final Token getNextToken()
public final Token getToken(int index)
private final int jj_ntk()
private void jj_add_error_token(int kind, int pos)
public ParseException generateParseException()
public final void enable_tracing()
public final void disable_tracing()
private final void jj_rescan_token()
private final void jj_save(int index, int xla)
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES All Classes | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |