**Design Goals for Implementation of Itcl in Javascript** The internal types of a [TclObject js Object] (in the C-Implementation a TclObj) are: * OBJECT_TYPE_TEXT * OBJECT_TYPE_LIST * OBJECT_TYPE_INTEGER * OBJECT_TYPE_REAL * OBJECT_TYPE_BOOL * OBJECT_TYPE_DICT * OBJECT_TYPE_STMTS * OBJECT_TYPE_STMT * OBJECT_TYPE_WORD * OBJECT_TYPE_WORD_PART * OBJECT_TYPE_EXPR_TREE Parsing rules for Tcl script input are corresponding to the [Dodekalog]. The reason for partially parsing the Tcl input is mostly performance and to some extent later on easier handling of the execution of a statement. Partially parsing is done in the following way: all the tokenizing for Tcl is done, but no variables are expanded, no bracket commands are executed and braced parts are handled as one token. And also within quoted strings the parts, which have later on to be expanded are parsed into separate “word_part” [TclObject js Object]s. Same is done for array names and array references. ***Tokens*** returned from parsing are: * TOKEN_WORD_SEP * TOKEN_STR * TOKEN_EOL * TOKEN_EOF * TOKEN_ESC * TOKEN_CMD * TOKEN_VAR * TOKEN_EXPAND * TOKEN_PAREN * TOKEN_BRACE * TOKEN_VAR_ARRAY * TOKEN_VAR_ARRAY_NAME * TOKEN_ARRAY_NAME * TOKEN_VAR_COMPOSED * TOKEN_BRACED_VAR * TOKEN_QUOTED_STR * TOKEN_COMMENT * TOKEN_DECIMAL * TOKEN_INTEGER * TOKEN_REAL * TOKEN_BOOLEAN * TOKEN_HEX * TOKEN_OCTAL * TOKEN_MINUS * TOKEN_PLUS * TOKEN_MUL * TOKEN_DIV * TOKEN_MOD * TOKEN_LT * TOKEN_GT * TOKEN_LE * TOKEN_GE * TOKEN_NE * TOKEN_EQ * TOKEN_NOT * TOKEN_RP * TOKEN_AND * TOKEN_OR * TOKEN_EXOR * TOKEN_AND_IF * TOKEN_OR_IF * TOKEN_STR_EQ * TOKEN_STR_NE * TOKEN_STR_IN * TOKEN_STR_NI * TOKEN_STR_PARAM * TOKEN_STR_CMD * TOKEN_NO_WORD_SEP * TOKEN_EXPR * TOKEN_STMTS For “normal” Tcl code the tokens from TOKEN_WORD_SEP to TOKEN_COMMENT are returned Tokens TOKEN_DECIMAL to TOKEN_STR_NI are returned for expression like parts in if, while and in the expr command. The last few ones are used internally for partially parsed statements. ***Examples:*** String Token Value $abc TOKEN_VAR abc ${abc def} TOKEN_BRACED_VAR TOKEN_BRACE TOKEN_STR abc ${abc def} TOKEN_BRACED_VAR x(y) TOKEN_ARRAY_NAME x0x01y $x(y) TOKEN_VAR_ARRAY ${x}(y) TOKEN_VAR_ARRAY_NAME [set a 1] TOKEN_CMD {a y} TOKEN_BRACE a y “abc” TOKEN_QUOTED_STRING abc “abc[x a]$y{d e f}yyy” TOKEN_QUOTED_STRING TOKEN_STR abc TOKEN_CMD x a TOKEN_VAR y TOKEN_BRACE d e f TOKEN_STR yyy xyz TOKEN_STR xyz {*} TOKEN_EXPAND “” Some commands use a statement part as en expression to be evaluated and to return a value of true or false like if and while for the condition or the Tcl expr command. For these the condition is parsed to an expression tree existing of nodes ([TclNode js Object] ). When tokenizing an expression string first all parts are put into nodes objects and these [TclNode js Object]s are placed in a tree with the operator as the parent node and the operands as the child nodes. A paren “(“ is also a parent node. The nodes are first put in parsing order in the expression tree and afterward the expression tree is reorganized according to the precedence rules o the operators. ***Operators*** are: + TOKEN_PLUS - TOKEN_MINUS * TOKEN_MUL / TOKEN_DIV % TOKEN_MOD < TOKEN_LT > TOKEN_GT <= TOKEN_LE >= TOKEN_GE != TOKEN_NE == TOKEN_EQ ! TOKEN_NOT ( TOKEN_PAREN pseudo operator used for precedence handling ) TOKEN_RP pseudo operator used for precedence handling & TOKEN_AND | TOKEN_OR ^ TOKEN_EXOR && TOKEN_AND_IF || TOKEN_OR_IF eq TOKEN_STR_EQ ne TOKEN_STR_NE in TOKEN_STR_IN ni TOKEN_STR_NI ***Precedence rules*** are (as in C): TOKEN_OR_IF 1 TOKEN_AND_IF 2 TOKEN_OR 3 TOKEN_EXOR 4 TOKEN_AND 5 TOKEN_EQ 6 TOKEN_NE 6 TOKEN_LT 7 TOKEN_GT 7 TOKEN_LE 7 TOKEN_GE 7 TOKEN_PLUS 9 TOKEN_MINUS 9 TOKEN_MUL 10 TOKEN_DIV 10 TOKEN_MOD 10 TOKEN_PAREN 12 TOKEN_STR 99 Reorganizing is done in flipping nodes that have a higher precedence: * if precedence of node is greater than the precedence of the left node and the node is not a TOKEN_PAREN flip nodes. * set the parent->child_left to child_left of the node * set parent of the node to child_left * set child_left of the node to child_left->child_right * set child_left->child_right to the node * reorganize child_left Some tokens are used only internal during parsing: TOKEN_EOL the separator for a Tcl statement either “\r”, “\n” or a “;” TOKEN_WORD_SEP space or tab between words TOKEN_ESC for signaling the different parts of a word like in yyy[a b]ccc one part is yyy one part is the TOKEN_CMD “a b” and one part is ccc. In between TOKEN_ESC is returned to signal these parts TOKEN_EOF at the end of the code to parse Some tokens are only used within expression trees: TOKEN_INTEGER 1 to n digits 0-9 TOKEN_DECIMAL an integer with a leading unary “+” or “-” TOKEN_REAL a decimal with a “.” as the fraction separator, a fraction and an exponent with e+/-nnn syntax TOKEN_BOOLEAN the Tcl values for a boolean, true/false/0/1 … TOKEN_HEX 0x followed by 0-9A-Fa-f characters TOKEN_OCTAL 0-7 1 to n characters (Part of [itcl in Javascript Paper]) <>Category Tcl Implementations | Category Language