Package org.jmol.script
Class ScriptCompiler
- java.lang.Object
-
- org.jmol.script.ScriptTokenParser
-
- org.jmol.script.ScriptCompiler
-
public class ScriptCompiler extends ScriptTokenParser
-
-
Field Summary
Fields Modifier and Type Field Description private T[][]aatokenCompiledprivate intafterMathprivate intafterWhiteprivate booleanallowMissingEndprivate intbraceCountprivate intbracketCountprivate intcchScriptprivate intcchTokenprivate booleancheckImpliedScriptCmdprivate charchFirstprivate java.lang.Stringcommentprivate java.util.Map<java.lang.String,SV>contextVariablesprivate static intCONTINUEprivate booleanendOfLineprivate static intEOLprivate static intERRORprivate java.lang.Stringfilenameprivate ScriptFlowContextflowContextprivate ScriptFlowContextforceFlowContextprivate intforPoint3private booleanhaveCommentsprivate booleanhaveENDIFprivate intiBraceprivate intichBraceprivate java.lang.Stringidentprivate java.lang.StringidentLCprivate booleaniHaveQuotedStringprivate booleanimplicitStringprivate booleanisCheckOnlyprivate booleanisCommentprivate booleanisDotDotprivate booleanisEndOfCommandprivate booleanisShowCommandprivate booleanisShowScriptOutputprivate booleanisSilentprivate booleanisUserTokenprivate int[][]lineIndicesprivate short[]lineNumbersprivate javajs.util.Lst<T[]>lltokenprivate intlnLengthprivate javajs.util.Lst<T>ltokenprivate booleanneedRightParenprivate intnSemiSkipprivate static intOKprivate static intOK2private intparenCountprivate booleanpreDefiningprivate intptSemiprivate intpushCountprivate static intRESTART(package private) java.lang.StringscriptExtensionsprivate intsetBraceCountprivate intsetEqualPtprivate ScriptFunctionthisFunctionprivate inttokInitialPlusPlusprivate inttokLastMathprivate javajs.util.Lst<T>vBracesprivate javajs.util.Lst<ScriptFunction>vFunctionStackprivate javajs.util.Lst<T>vPush-
Fields inherited from class org.jmol.script.ScriptTokenParser
atokenInfix, ERROR_badArgumentCount, ERROR_badContext, ERROR_commandExpected, ERROR_endOfCommandUnexpected, ERROR_invalidExpressionToken, ERROR_missingEnd, ERROR_tokenExpected, ERROR_tokenUnexpected, ERROR_unrecognizedParameter, ERROR_unrecognizedToken, errorLine, errorMessage, errorMessageUntranslated, errorType, haveMacro, haveString, htUserFunctions, ichComment, ichCurrentCommand, ichEnd, ichToken, iCommand, isCommaAsOrAllowed, isEmbeddedExpression, isMathExpressionCommand, isNewSet, isSetBrace, isSetOrDefine, isStateScript, itokenInfix, lastFlowCommand, lastToken, lineCurrent, logMessages, nTokens, ptNewSetModifier, script, theTok, theToken, tokCommand, tokenAndEquals, tokenCommand, vwr
-
-
Constructor Summary
Constructors Constructor Description ScriptCompiler(Viewer vwr)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private voidaddBrace(T t)(package private) static voidaddContextVariable(java.util.Map<java.lang.String,SV> contextVariables, java.lang.String name)private voidaddNumber(int tok, int i, java.lang.Object v)private voidaddTokenToPrefix(T token)private charcharAt(int i)private intcheckFlowCommand(java.lang.String ident)private booleancheckFlowEnd(int tok, java.lang.String ident, int pt1, boolean isExplicitEnd)private intcheckFlowEndBrace()process a pending explicit right brace }private booleancheckFlowStartBrace(boolean atEnd)private booleancheckNewSetCommand()private intcheckSpecialParameterSyntax()Check for special parameters, including: +, -, \, *, /, &, |, =, period, or [, single or double quote, command-specific parameters, $....private voidcheckUnquotedFileName()private java.lang.StringcleanScriptComments(java.lang.String script)allows for three kinds of comments.(package private) ScriptContextcompile(java.lang.String filename, java.lang.String script, boolean isPredefining, boolean isSilent, boolean debugScript, boolean isCheckOnly)private booleancompile0(boolean isFull)private booleancompileCommand()private booleaneol(char ch)look for end-of-line character \r, \n, or ; that is not within a command such as for (var i=0;i < 10; i++)private intERROR(int error)private intERROR(int error, java.lang.String value)private voidfixFlowAddLine(ScriptFlowContext flowContext)private TflowStart(T token)private intforceFlowEnd(T token)private booleangetData(java.lang.String key)private intgetPrefixToken()private java.lang.StringgetUnescapedStringLiteral(boolean isFileName)lookingAtString returned true, and we need to unescape any t, r, n, ", ', x, u, or backslash after a backslashprivate booleanhandleError()private intincrementLineCount(java.lang.String str)(package private) static booleanisBreakableContext(int tok)private booleanisContextVariable(java.lang.String ident)private booleanisFlowIfContextOK(ScriptFlowContext f)check for proper sequence: if...[any number of elseif]...[zero or one else]...[endif]private booleanisLineContinuation(int ichT, boolean checkMathop)private static booleanisSpaceOrTab(char ch)private booleanlookForSyncID()Check for a set of characters that does not start with double quote or at-sign and terminates with #, }, or an end of line.(package private) BSlookingAtBitset()private intlookingAtComment()private booleanlookingAtDecimal()private booleanlookingAtEndOfLine()Look for end of script or a new line.private floatlookingAtExponential()private booleanlookingAtImpliedString(boolean allowSpace, boolean allowEquals, boolean allowSptParen)An "implied string" is a parameter that is not quoted but because of its position in a command is implied to be a string.private intlookingAtInteger()private booleanlookingAtLeadingWhitespace()private booleanlookingAtLoadFormat(boolean allchar)private booleanlookingAtLookupToken(int ichT)private booleanlookingAtMathContinuation(int ichT)private java.lang.ObjectlookingAtMatrix()private booleanlookingAtObjectID()Look for a valid $...private booleanlookingAtSeqcode()private booleanlookingAtSetBraceSyntax()look for '{' at the start of a command, allowing for syntaxes {xxx}.yyy = ...private booleanlookingAtString(boolean allowPrime)look for a quoted string, possibly allowing single quotes.private booleanlookingAtTerminator()Look for valid terminating semicolon -- one not within for(), for example.private intnCharNewLine(int ichT)Check for line ending at this point in script.private voidnewContextVariable(java.lang.String ident)private intparseCommandParameter(short iLine, boolean isFull)private intparseKnownToken()private intprocessTokenList(short iLine, boolean doCompile)private voidpushContext(T t)private voidreplaceCommand(T token)private voidsetAaTokenCompiled()private TsetCommand(T token)private voidsetFlowEnd(int tokCommand, java.lang.String ident)generate a new end token with pointer to the start or to default as the intValue and set it as the command tokenprivate TsetNewSetCommand(boolean isSetBrace, java.lang.String ident)protected inttokAt(int i)private TtokenAt(int i)private voidtokenizePlusPlus(int tok, boolean isPlusPlusX)static java.lang.StringunescapeString(java.lang.String script, int ich, int nChar)private booleanwasImpliedScript()Check for improperly parsed implied script command: only two tokens: [implied script] xxx.SORT/REVERSE/PUSH/POP more than two tokens: xxxx.spt(3,4,5)-
Methods inherited from class org.jmol.script.ScriptTokenParser
commandExpected, compileExpression, compileExpressions, error, errorIntStr2, errorStr, errorStr2, errorString, isUserFunction, tokenAttr
-
-
-
-
Field Detail
-
filename
private java.lang.String filename
-
isSilent
private boolean isSilent
-
contextVariables
private java.util.Map<java.lang.String,SV> contextVariables
-
aatokenCompiled
private T[][] aatokenCompiled
-
lineNumbers
private short[] lineNumbers
-
lineIndices
private int[][] lineIndices
-
lnLength
private int lnLength
-
preDefining
private boolean preDefining
-
isShowScriptOutput
private boolean isShowScriptOutput
-
isCheckOnly
private boolean isCheckOnly
-
haveComments
private boolean haveComments
-
scriptExtensions
java.lang.String scriptExtensions
-
thisFunction
private ScriptFunction thisFunction
-
flowContext
private ScriptFlowContext flowContext
-
ltoken
private javajs.util.Lst<T> ltoken
-
lltoken
private javajs.util.Lst<T[]> lltoken
-
vBraces
private javajs.util.Lst<T> vBraces
-
ichBrace
private int ichBrace
-
cchToken
private int cchToken
-
cchScript
private int cchScript
-
nSemiSkip
private int nSemiSkip
-
parenCount
private int parenCount
-
braceCount
private int braceCount
-
setBraceCount
private int setBraceCount
-
bracketCount
private int bracketCount
-
ptSemi
private int ptSemi
-
forPoint3
private int forPoint3
-
setEqualPt
private int setEqualPt
-
iBrace
private int iBrace
-
iHaveQuotedString
private boolean iHaveQuotedString
-
isEndOfCommand
private boolean isEndOfCommand
-
needRightParen
private boolean needRightParen
-
endOfLine
private boolean endOfLine
-
comment
private java.lang.String comment
-
OK
private static final int OK
- See Also:
- Constant Field Values
-
OK2
private static final int OK2
- See Also:
- Constant Field Values
-
CONTINUE
private static final int CONTINUE
- See Also:
- Constant Field Values
-
EOL
private static final int EOL
- See Also:
- Constant Field Values
-
ERROR
private static final int ERROR
- See Also:
- Constant Field Values
-
RESTART
private static final int RESTART
- See Also:
- Constant Field Values
-
tokLastMath
private int tokLastMath
-
checkImpliedScriptCmd
private boolean checkImpliedScriptCmd
-
vFunctionStack
private javajs.util.Lst<ScriptFunction> vFunctionStack
-
allowMissingEnd
private boolean allowMissingEnd
-
isShowCommand
private boolean isShowCommand
-
isComment
private boolean isComment
-
isUserToken
private boolean isUserToken
-
implicitString
private boolean implicitString
-
tokInitialPlusPlus
private int tokInitialPlusPlus
-
afterWhite
private int afterWhite
-
isDotDot
private boolean isDotDot
-
ident
private java.lang.String ident
-
identLC
private java.lang.String identLC
-
vPush
private javajs.util.Lst<T> vPush
-
pushCount
private int pushCount
-
forceFlowContext
private ScriptFlowContext forceFlowContext
-
haveENDIF
private boolean haveENDIF
-
chFirst
private char chFirst
-
afterMath
private int afterMath
-
-
Constructor Detail
-
ScriptCompiler
public ScriptCompiler(Viewer vwr)
- Parameters:
vwr-
-
-
Method Detail
-
compile
ScriptContext compile(java.lang.String filename, java.lang.String script, boolean isPredefining, boolean isSilent, boolean debugScript, boolean isCheckOnly)
-
newContextVariable
private void newContextVariable(java.lang.String ident)
-
addContextVariable
static void addContextVariable(java.util.Map<java.lang.String,SV> contextVariables, java.lang.String name)
-
isContextVariable
private boolean isContextVariable(java.lang.String ident)
-
cleanScriptComments
private java.lang.String cleanScriptComments(java.lang.String script)
allows for three kinds of comments. NOTE: closing involves asterisks and slash together, but that can't be shown here. 1) /** .... ** / super-comment 2) /* ..... * / may be INSIDE /**....** /). 3) \n//.....\n single-line comments -- like #, but removed entirely The reason is that /* ... * / will appear as standard in MOVETO command but we still might want to escape it, so around that you can have /** .... ** / The terminator is not necessary -- so you can quickly escape anything in a file after /** or /* In addition, we can have [/*|/**] .... **** Jmol Embedded Script **** [script commands] [** /|* /] Then ONLY that script is taken. This is a powerful and simple way then to include Jmol scripting in any file -- including, for example, HTML as an HTML comment. Just send the whole file to Jmol, and it will find its script!- Parameters:
script-- Returns:
- cleaned script
-
addTokenToPrefix
private void addTokenToPrefix(T token)
-
compile0
private boolean compile0(boolean isFull)
-
setAaTokenCompiled
private void setAaTokenCompiled()
-
lookingAtLeadingWhitespace
private boolean lookingAtLeadingWhitespace()
-
isLineContinuation
private boolean isLineContinuation(int ichT, boolean checkMathop)
-
lookingAtMathContinuation
private boolean lookingAtMathContinuation(int ichT)
-
lookingAtEndOfLine
private boolean lookingAtEndOfLine()
Look for end of script or a new line. Set ichEnd to this point or end of string; if found, set cchToken to the number of eol characters;- Returns:
- true if eol
-
nCharNewLine
private int nCharNewLine(int ichT)
Check for line ending at this point in script.- Parameters:
ichT-- Returns:
- 1 if \n or \r, 2 if \r\n, or 0 otherwise (including end of script)
-
lookingAtTerminator
private boolean lookingAtTerminator()
Look for valid terminating semicolon -- one not within for(), for example.- Returns:
- true if valid semi
-
lookingAtComment
private int lookingAtComment()
-
charAt
private char charAt(int i)
-
processTokenList
private int processTokenList(short iLine, boolean doCompile)
-
addBrace
private void addBrace(T t)
- Parameters:
t- could be { or } or a command such as FOR or WHILE
-
pushContext
private void pushContext(T t)
-
wasImpliedScript
private boolean wasImpliedScript()
Check for improperly parsed implied script command: only two tokens: [implied script] xxx.SORT/REVERSE/PUSH/POP more than two tokens: xxxx.spt(3,4,5)- Returns:
- true if found
-
compileCommand
private boolean compileCommand()
-
tokenAt
private T tokenAt(int i)
-
tokAt
protected int tokAt(int i)
- Overrides:
tokAtin classScriptTokenParser
-
replaceCommand
private void replaceCommand(T token)
-
getPrefixToken
private int getPrefixToken()
-
checkSpecialParameterSyntax
private int checkSpecialParameterSyntax()
Check for special parameters, including: +, -, \, *, /, &, |, =, period, or [, single or double quote, command-specific parameters, $.... identifiers, exponential notation, decimal numbers, sequence codes, integers, bitsets ({....}) or [{....}], or matrices- Returns:
- OK, CONTINUE, or ERROR
-
addNumber
private void addNumber(int tok, int i, java.lang.Object v)
-
lookingAtMatrix
private java.lang.Object lookingAtMatrix()
-
parseKnownToken
private int parseKnownToken()
-
tokenizePlusPlus
private void tokenizePlusPlus(int tok, boolean isPlusPlusX)
-
checkNewSetCommand
private boolean checkNewSetCommand()
-
parseCommandParameter
private int parseCommandParameter(short iLine, boolean isFull)
-
setNewSetCommand
private T setNewSetCommand(boolean isSetBrace, java.lang.String ident)
-
checkUnquotedFileName
private void checkUnquotedFileName()
-
checkFlowStartBrace
private boolean checkFlowStartBrace(boolean atEnd)
-
checkFlowEndBrace
private int checkFlowEndBrace()
process a pending explicit right brace }- Returns:
- continuation status
-
forceFlowEnd
private int forceFlowEnd(T token)
-
isBreakableContext
static boolean isBreakableContext(int tok)
-
checkFlowCommand
private int checkFlowCommand(java.lang.String ident)
-
setFlowEnd
private void setFlowEnd(int tokCommand, java.lang.String ident)generate a new end token with pointer to the start or to default as the intValue and set it as the command token- Parameters:
tokCommand- end or endifident- "end" or "endif"
-
isFlowIfContextOK
private boolean isFlowIfContextOK(ScriptFlowContext f)
check for proper sequence: if...[any number of elseif]...[zero or one else]...[endif]- Parameters:
f-- Returns:
- true if OK
-
checkFlowEnd
private boolean checkFlowEnd(int tok, java.lang.String ident, int pt1, boolean isExplicitEnd)- Parameters:
tok- the XXX in END XXXident-pt1-isExplicitEnd- actual END IF or END FOR, etc.- Returns:
- true if no error
-
fixFlowAddLine
private void fixFlowAddLine(ScriptFlowContext flowContext)
-
getData
private boolean getData(java.lang.String key)
-
incrementLineCount
private int incrementLineCount(java.lang.String str)
-
isSpaceOrTab
private static boolean isSpaceOrTab(char ch)
-
eol
private boolean eol(char ch)
look for end-of-line character \r, \n, or ; that is not within a command such as for (var i=0;i < 10; i++)- Parameters:
ch-- Returns:
- true if end of line
-
lookingAtSetBraceSyntax
private boolean lookingAtSetBraceSyntax()
look for '{' at the start of a command, allowing for syntaxes {xxx}.yyy = ... or {xxx}[yy] = ...- Returns:
- true only if found
-
lookingAtString
private boolean lookingAtString(boolean allowPrime)
look for a quoted string, possibly allowing single quotes.- Parameters:
allowPrime- cd, echo, gotocmd, help, hover, javascript, label, message, and pause all are implicitly strings. You CAN use "..." but you don't have to, and you cannot use '...'. This way the introduction of single quotes as an equivalent of double quotes cannot break existing scripts. -- BH 06/2009- Returns:
- true only if found
-
getUnescapedStringLiteral
private java.lang.String getUnescapedStringLiteral(boolean isFileName)
lookingAtString returned true, and we need to unescape any t, r, n, ", ', x, u, or backslash after a backslash- Parameters:
isFileName- in certain cases, such as load "c:\temp\myfile.xyz" we only want to decode unicode, not other characters.- Returns:
- quoted string
-
unescapeString
public static java.lang.String unescapeString(java.lang.String script, int ich, int nChar)
-
lookingAtLoadFormat
private boolean lookingAtLoadFormat(boolean allchar)
-
lookingAtImpliedString
private boolean lookingAtImpliedString(boolean allowSpace, boolean allowEquals, boolean allowSptParen)An "implied string" is a parameter that is not quoted but because of its position in a command is implied to be a string. First we must exclude the- Parameters:
allowSpace- as in commands such as echoallowEquals- as in the load command, first parameter load =xxx but NOT any other commandallowSptParen- specifically for script/load command, first parameter xxx.spt(3,4,4)- Returns:
- true or false
-
lookingAtExponential
private float lookingAtExponential()
-
lookingAtDecimal
private boolean lookingAtDecimal()
-
lookingAtSeqcode
private boolean lookingAtSeqcode()
-
lookingAtInteger
private int lookingAtInteger()
-
lookingAtBitset
BS lookingAtBitset()
-
lookingAtObjectID
private boolean lookingAtObjectID()
Look for a valid $... sequence. This must be alphanumeric or _ or ~ only. We skip any $"...". That will be handled later.- Returns:
- true only if valid $....
-
lookingAtLookupToken
private boolean lookingAtLookupToken(int ichT)
-
lookForSyncID
private boolean lookForSyncID()
Check for a set of characters that does not start with double quote or at-sign and terminates with #, }, or an end of line. Only used for the SYNC command's second character.- Returns:
- true if ID is found.
-
ERROR
private int ERROR(int error)
-
ERROR
private int ERROR(int error, java.lang.String value)
-
handleError
private boolean handleError()
-
-