<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: expression code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Wed, 23 Jul 2008 18:44:34 GMT</pubDate>
    <description>DZone Snippets: expression code</description>
    <item>
      <title>DBASE Expression Operators</title>
      <link>http://snippets.dzone.com/posts/show/5529</link>
      <description>//Operators like '+' , ' * ', or '&lt;' are used to manipulate constants and fields.&lt;br /&gt;//For example, "3+8" is an example of a dBASE expression in which the&lt;br /&gt;//Add operator acts on two numeric constants to return the numeric value&lt;br /&gt;//"11".&lt;br /&gt;//The values an operator acts on must have a type appropriate for the&lt;br /&gt;//operator. For example, the divide '/' operator acts on two numeric values.&lt;br /&gt; &lt;br /&gt;//Precedence&lt;br /&gt;//Operators have a precedence which specifies operator evaluation order.&lt;br /&gt;//The precedence of each operator is specified in the following tables which&lt;br /&gt;//describe the various operators. The higher the precedence, the earlier the&lt;br /&gt;//operation will be performed. For example, 'divide' has a precedence of 6&lt;br /&gt;//and 'plus' has a precedence of 5 which means 'divide' is evaluated before&lt;br /&gt;//'plus'. Consequently, "1+4/2" is "3".&lt;br /&gt;//Evaluation order can be made explicit by using brackets. For example,&lt;br /&gt;//"1+2 * 3" returns "7" and "(1+2) * 3" returns "9".&lt;br /&gt;Numeric Operators&lt;br /&gt; &lt;br /&gt;The numeric operators all operate on Numeric values.&lt;br /&gt; &lt;br /&gt;Operator	Name	Symbol Precedence&lt;br /&gt;Add	+	5&lt;br /&gt;Subtract	- 	5&lt;br /&gt;Multiply	*	6&lt;br /&gt;Divide	/	6&lt;br /&gt;Exponent	** or ^	7&lt;br /&gt; &lt;br /&gt;Character Operators&lt;br /&gt;There are two character operators, named "Concatenate I" and&lt;br /&gt;"Concatenate II", which combine two character values into one. They are&lt;br /&gt;distinguished from the Add and Subtract operators by the types of the&lt;br /&gt;values they operate on.&lt;br /&gt; &lt;br /&gt;Operator	Name	Symbol Precedence&lt;br /&gt;Concatenate	I +	5&lt;br /&gt;Concatenate	II -	5&lt;br /&gt; &lt;br /&gt;Examples:&lt;br /&gt;" 'John ' + 'Smith' " becomes " 'John Smith' "&lt;br /&gt;" 'ABC' + 'DEF' " becomes " 'ABCDEF' "&lt;br /&gt;Concatenate II is slightly different as any spaces at the end of the first&lt;br /&gt;Character values are moved to the end of the result.&lt;br /&gt;" 'John'-'Smith ' " becomes " 'JohnSmith ' "&lt;br /&gt;" 'ABC' - 'DEF' " becomes " 'ABCDEF' "&lt;br /&gt;" 'A ' - 'D ' " becomes " 'AD ' "&lt;br /&gt; &lt;br /&gt;Relational Operators&lt;br /&gt;Relational Operators are operators which return a Logical result (which is&lt;br /&gt;either true or false). All operators, except Contain, operate on Numeric,&lt;br /&gt;Character or Date values. Contain operates on two character values and&lt;br /&gt;returns true if the first is contained in the second.&lt;br /&gt; &lt;br /&gt;Operator	Name	Symbol Precedence&lt;br /&gt;Equal To	=	4&lt;br /&gt;Not Equal To	&lt;&gt; or #	4&lt;br /&gt;Less Than	&lt;	4&lt;br /&gt;Greater Than	&gt;	4&lt;br /&gt;Less Than or Equal To	&lt; =	4&lt;br /&gt;Greater Than or Equal To	&gt; =	4&lt;br /&gt;Contain	$	4&lt;br /&gt; &lt;br /&gt;Examples:&lt;br /&gt;" 'CD' $ 'ABCD' " returns ".T."&lt;br /&gt;" 8&lt;7 " returns ".F."&lt;br /&gt; &lt;br /&gt;Logical Operators&lt;br /&gt;Logical Operators return a Logical Result and operate on two Logical&lt;br /&gt;values.&lt;br /&gt; &lt;br /&gt;Operator	Name	Symbol Precedence&lt;br /&gt;Not	.NOT.	3&lt;br /&gt;And	.AND.	2&lt;br /&gt;Or	.OR.	1&lt;br /&gt; &lt;br /&gt;Examples:&lt;br /&gt;" .NOT. .T. " returns ".F."&lt;br /&gt;" .T. .AND. .F." returns ".F." &lt;br /&gt;&lt;br /&gt;</description>
      <pubDate>Wed, 21 May 2008 05:41:15 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5529</guid>
      <author>dubby (Dave)</author>
    </item>
    <item>
      <title>Extract the filename from a URL</title>
      <link>http://snippets.dzone.com/posts/show/5407</link>
      <description>This ECMAScript extracts the filename from a URL. eg. the filename 'index4.svg' would be extracted from the document.URL with the value 'http://rorbuilder.info/r/whiteboardqueue/index4.svg'.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var regexp = /(\w|[-.])+$/&lt;br /&gt;str = document.URL&lt;br /&gt;a = regexp.exec(str)&lt;br /&gt;alert(a[0])&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Reference: &lt;a href="http://www.webreference.com/js/column5/methods.html"&gt;Regular Expressions: Methods - Doc JavaScript&lt;/a&gt; [webreference.com]</description>
      <pubDate>Sun, 20 Apr 2008 15:24:54 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5407</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>Calculate Last Day of Last Month</title>
      <link>http://snippets.dzone.com/posts/show/5076</link>
      <description>VB/VBA/VB.NET one-liner to calculate the end of last month. Useful for SSRS/RDL Expressions and Excel/Office Formulas. Note that it does not use string parsing, which can cause localization problems.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;DateAdd("d", -1.0 * DatePart("d", Today), Today)&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 01 Feb 2008 22:51:12 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5076</guid>
      <author>jokeyxero (xero)</author>
    </item>
    <item>
      <title>Calculate First Day of Current Month</title>
      <link>http://snippets.dzone.com/posts/show/5075</link>
      <description>VB/VBA/VB.NET one-liner to calculate the start of the current month. Useful for SSRS/RDL Expressions and Excel/Office Formulas. Note that it does not use string parsing, which can cause localization problems.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;DateAdd("D", -1.0 * DatePart("D", Today) + 1, Today)&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 01 Feb 2008 22:48:45 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5075</guid>
      <author>jokeyxero (xero)</author>
    </item>
    <item>
      <title>Calculate First Day of Last Month</title>
      <link>http://snippets.dzone.com/posts/show/5074</link>
      <description>VB/VBA/VB.NET one-liner to calculate the start of the previous month. Useful for SSRS/RDL Expressions and Excel/Office Formulas. Note that it does not use string parsing, which can cause localization problems.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;DateAdd("D", -1.0 * DatePart("D", Today) + 1, DateAdd("m", -1, Today))&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 01 Feb 2008 22:47:11 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5074</guid>
      <author>jokeyxero (xero)</author>
    </item>
    <item>
      <title>Simple integer expression interpreter</title>
      <link>http://snippets.dzone.com/posts/show/4481</link>
      <description>This is a simple integer expression interpreter.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;iostream&gt;&lt;br /&gt;#include &lt;string&gt;&lt;br /&gt;#include &lt;map&gt;&lt;br /&gt;#include &lt;cctype&gt;&lt;br /&gt;&lt;br /&gt;char look;&lt;br /&gt;std::map&lt;std::string, int&gt; table;&lt;br /&gt;&lt;br /&gt;void getChar() {&lt;br /&gt;    look = std::cin.get();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void error(const std::string &amp;s) {&lt;br /&gt;    std::cout &lt;&lt; std::endl;&lt;br /&gt;    std::cout &lt;&lt; "Error: " &lt;&lt; s &lt;&lt; "." &lt;&lt; std::endl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void abort(const std::string &amp;s) {&lt;br /&gt;    error(s);&lt;br /&gt;    exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void expected(const std::string &amp;s) {&lt;br /&gt;    abort(s + " Expected");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool isAlpha(char c) {&lt;br /&gt;    return isalpha(c);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool isDigit(char c) {&lt;br /&gt;    return isdigit(c);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool isAlNum(char c) {&lt;br /&gt;    return isalnum(c);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool isAddop(char c) {&lt;br /&gt;    return ((c == '+') || (c == '-'));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool isMulop(char c) {&lt;br /&gt;    return (('*' == c) || ('/' == c));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool isWhite(char c) {&lt;br /&gt;    return ((' ' == c) || ('\t' == c));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void skipWhite() {&lt;br /&gt;    while (isWhite(look))&lt;br /&gt;        getChar();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void match(char x) {&lt;br /&gt;    if (look != x)&lt;br /&gt;        expected(std::string("\"") + x + "\"");&lt;br /&gt;    else {&lt;br /&gt;        getChar();&lt;br /&gt;        skipWhite();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void emit(const std::string &amp;s) {&lt;br /&gt;    std::cout &lt;&lt; "\t"  &lt;&lt; s;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void emitLn(const std::string &amp;s) {&lt;br /&gt;    emit(s);&lt;br /&gt;    std::cout &lt;&lt; std::endl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void newLine() {&lt;br /&gt;    if (look == '\n')&lt;br /&gt;        getChar();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;std::string getName() {&lt;br /&gt;    if (!isAlpha(look))&lt;br /&gt;        expected("Name");&lt;br /&gt;&lt;br /&gt;    std::string name;&lt;br /&gt;    while (isAlNum(look)) {&lt;br /&gt;        name += look;&lt;br /&gt;        getChar();&lt;br /&gt;    }&lt;br /&gt;    skipWhite();&lt;br /&gt;&lt;br /&gt;    return name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int getNum() {&lt;br /&gt;    int value(0);&lt;br /&gt;&lt;br /&gt;    if (!isDigit(look))&lt;br /&gt;        expected("Integer");&lt;br /&gt;&lt;br /&gt;    while (isDigit(look)) {&lt;br /&gt;        value = value * 10 + look - '0';&lt;br /&gt;        getChar();&lt;br /&gt;    }&lt;br /&gt;    skipWhite();&lt;br /&gt;&lt;br /&gt;    return value;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int expression();&lt;br /&gt;&lt;br /&gt;int factor() {&lt;br /&gt;    int ret;&lt;br /&gt;&lt;br /&gt;    if (look == '(') {&lt;br /&gt;        match('(');&lt;br /&gt;        ret = expression();&lt;br /&gt;        match(')');&lt;br /&gt;    } else if (isAlpha(look)) {&lt;br /&gt;        std::string name = getName();&lt;br /&gt;        if (table.count(name) == 0)&lt;br /&gt;            table.insert(std::pair&lt;std::string, int&gt;(name, 0));&lt;br /&gt;        ret = table[name];&lt;br /&gt;    } else&lt;br /&gt;        ret = getNum();&lt;br /&gt;&lt;br /&gt;    return ret;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int term() {&lt;br /&gt;    int value = factor();&lt;br /&gt;&lt;br /&gt;    while (isMulop(look)) {&lt;br /&gt;        if (look == '*') {&lt;br /&gt;            match('*');&lt;br /&gt;            value *= factor();&lt;br /&gt;        } else if (look == '/') {&lt;br /&gt;            match('/');&lt;br /&gt;            value /= factor();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return value;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int expression() {&lt;br /&gt;    int value(0);&lt;br /&gt;&lt;br /&gt;    if (!isAddop(look))&lt;br /&gt;        value = term();&lt;br /&gt;&lt;br /&gt;    while (isAddop(look)) {&lt;br /&gt;        if (look == '+') {&lt;br /&gt;            match('+');&lt;br /&gt;            value += term();&lt;br /&gt;        } else if (look == '-') {&lt;br /&gt;            match('-');&lt;br /&gt;            value -= term();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return value;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void assignment() {&lt;br /&gt;    std::string name = getName();&lt;br /&gt;    match('=');&lt;br /&gt;    if (table.count(name) == 1)&lt;br /&gt;        table[name] = expression();&lt;br /&gt;    else&lt;br /&gt;        table.insert(std::pair&lt;std::string, int&gt;(name, expression()));&lt;br /&gt;&lt;br /&gt;    std::cout &lt;&lt; name &lt;&lt; " = " &lt;&lt; table[name] &lt;&lt; std::endl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void init() {&lt;br /&gt;    getChar();&lt;br /&gt;    skipWhite();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {&lt;br /&gt;    init();&lt;br /&gt;&lt;br /&gt;    do {&lt;br /&gt;        assignment();&lt;br /&gt;        newLine();&lt;br /&gt;    } while ((look != '.') &amp;&amp; (look != '\n'));&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 30 Aug 2007 14:45:36 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4481</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
    <item>
      <title>Expression tree builder</title>
      <link>http://snippets.dzone.com/posts/show/4188</link>
      <description>EvalExp(s) turns the string s into an expression tree and returns it.&lt;br /&gt;&lt;br /&gt;Inorder, preorder and postorder can then be used to turn transform the tree into inorder, preorder or postorder expressions.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;function inorder(T) {&lt;br /&gt;  if ((T.cargo  == '+') || (T.cargo  == '-') || (T.cargo  == '*') || (T.cargo  == '/'))&lt;br /&gt;    return [].concat(inorder(T.left)).concat(T.cargo).concat(inorder(T.right));&lt;br /&gt;&lt;br /&gt;  return new Array(T.cargo);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function preorder(T) {&lt;br /&gt;  if ((T.cargo  == '+') || (T.cargo  == '-') || (T.cargo  == '*') || (T.cargo  == '/'))&lt;br /&gt;    return [].concat(T.cargo).concat(preorder(T.left)).concat(preorder(T.right));&lt;br /&gt;&lt;br /&gt;  return new Array(T.cargo);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function postorder(T) {&lt;br /&gt;  if ((T.cargo  == '+') || (T.cargo  == '-') || (T.cargo  == '*') || (T.cargo  == '/'))&lt;br /&gt;    return [].concat(postorder(T.left)).concat(postorder(T.right)).concat(T.cargo);&lt;br /&gt;&lt;br /&gt;  return new Array(T.cargo);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function Tree(cargo, left, right) {&lt;br /&gt;  this.cargo = cargo;&lt;br /&gt;  this.left = left;&lt;br /&gt;  this.right = right;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function split(s) {&lt;br /&gt;  var r = [];&lt;br /&gt;  var cur = '';&lt;br /&gt;  for (var i = 0; i &lt; s.length; ++i) {&lt;br /&gt;    var c = s.charAt(i);&lt;br /&gt;    if ((c == '+') || (c == '-') || (c == '*') || (c == '/') || (c == '(') || (c == ')')) {&lt;br /&gt;      cur.replace(" ", "");&lt;br /&gt;      if (cur.length &gt; 0) {&lt;br /&gt;        r.push(cur);&lt;br /&gt;        cur = '';&lt;br /&gt;      }&lt;br /&gt;      r.push(c);&lt;br /&gt;    } else {&lt;br /&gt;      cur += c;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  if (cur.length &gt; 0)&lt;br /&gt;    r.push(cur);&lt;br /&gt;&lt;br /&gt;  return r;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getToken(tokens, expected) {&lt;br /&gt;  if (tokens[0] == expected) {&lt;br /&gt;    tokens.splice(0, 1);&lt;br /&gt;    return true;&lt;br /&gt;  }&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getVar(tokens) {&lt;br /&gt;  if (getToken(tokens, '(')) {&lt;br /&gt;    var a = getSum(tokens);&lt;br /&gt;    getToken(tokens, ')');&lt;br /&gt;&lt;br /&gt;    return a;&lt;br /&gt;  } else {&lt;br /&gt;    var aux = tokens[0];&lt;br /&gt;    tokens.splice(0, 1);&lt;br /&gt;&lt;br /&gt;    return new Tree(aux, undefined, undefined);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getProduct(tokens) {&lt;br /&gt;  var a = getVar(tokens);&lt;br /&gt;&lt;br /&gt;  if (getToken(tokens, '*')) {&lt;br /&gt;    var b = getProduct(tokens);&lt;br /&gt;&lt;br /&gt;    return new Tree('*', a, b);&lt;br /&gt;  } else if (getToken(tokens, '/')) {&lt;br /&gt;    var b = getProduct(tokens);&lt;br /&gt;&lt;br /&gt;    return new Tree('/', a, b);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return a;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getSum(tokens) {&lt;br /&gt;  var a = getProduct(tokens);&lt;br /&gt;&lt;br /&gt;  if (getToken(tokens, '+')) {&lt;br /&gt;    var b = getSum(tokens);&lt;br /&gt;&lt;br /&gt;    return new Tree('+', a, b);&lt;br /&gt;  } else if (getToken(tokens, '-')) {&lt;br /&gt;    var b = getSum(tokens);&lt;br /&gt;&lt;br /&gt;    return new Tree('-', a, b);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return a;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function evalExp(s) {&lt;br /&gt;  var tokens = split(s);&lt;br /&gt;&lt;br /&gt;  //alert(tokens);&lt;br /&gt;&lt;br /&gt;  return t = getSum(tokens);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 22 Jun 2007 14:21:31 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4188</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
  </channel>
</rss>
