There are four token types used for arrays and functions, which include identifiers with and without parentheses (could be either a variable, an array or a user function to be determined by the encoder), and a defined function with and without parentheses. A define function without parentheses simply gets added to the output list and push to the done stack like constants, identifiers with no parentheses, and internals functions with no parentheses. To support the other two types (identifiers and define functions with parentheses) the get operand routine was updated to call the newly implemented get parentheses token routine.
The new get parentheses token routine starts by pushing the parentheses token to the hold stack, which being of low precedence, will create a border as the expressions of the arguments are processed. A number of operands counter is initialized and a loop is entered for each operand by first calling the get expression routine. If the parentheses token is an identifier with parentheses, it could be a user function. Arguments of user functions are passed by reference, so any operand that could be an variable or array element has its reference flag set.
The terminating token is then checked. For a comma, the token is deleted and the operand is counted. For a closing parentheses, the existing process final operand function is called, which upon success attaches all the operands, appends the token with parentheses to the RPN output list, and pushes the token to the done stack. The token with parentheses is then dropped from the hold stack. For other terminating tokens, the appropriate error is returned.
One expression in test #3 had a different result from the old translator routines due to two issues. First, an array in the expression incorrectly had its reference flag set by the old routines (the new routines correctly did not). Second, the argument of a define function along with the define function incorrectly had their reference flags set. For a defined function, the old routines assumed the define functions would be passed by reference (and set the reference flags of arguments). This is no longer the case (see last post). These minor issues were corrected in the old routines and results for expression test #3 were updated.
[commit 847c5d078e]
Friday, July 5, 2013
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment
All comments and feedback welcomed, whether positive or negative.
(Anonymous comments are allowed, but comments with URL links or unrelated comments will be removed.)