SlideShare une entreprise Scribd logo
1  sur  12
Télécharger pour lire hors ligne
Parse Trees




          by

      John Kennedy
 Mathematics Department
  Santa Monica College
     1900 Pico Blvd.
 Santa Monica, CA 90405

rkennedy@ix.netcom.com
Except for this comment explaining that it is blank for
some deliberate reason, this page is intentionally blank!
Parse Trees
The process whereby a computer compiler takes parts of human written source code and produces an
internal structure in memory that represents the correct parts of a program that can be executed is what
we call Parsing. This paper will demonstrate how to create parse trees on paper that represent well-
formed mathematical formulas or expressions. We then show some examples of recursive functions that
operate on those parse trees. It is these recursive functions that justify the importance of parse trees in
the first place. Since most readers probably don't have sufficient programming expertise, this paper does
not explain how to create parse trees programmatically. This in itself is another fascinating topic worthy
of a more advanced paper. However, the current paper will have served its purpose if it motivates the
reader to further investigate the use of parse trees in any application domain, let alone the use of trees in
general.

Mathematical expressions represent only a very small part of any computer language, but they also
involve the more intricate parts of the grammars that define a language. While we won't discuss the
formal grammar of any particular language, we mention that most modern computer languages such as
FORTRAN, BASIC, C++, PASCAL, and JAVA all handle and represent mathematical expressions by
internally using the equivalent of binary trees. For this reason it is worthwhile to learn the relationship
between mathematical expressions and binary trees.

First you should try to understand that the trees we are going to create are recursive data structures.
They are recursive in a sense that will become more clear as we gain some experience and show some
program code. But first we should show several examples of parse trees before we show what to do with
them. One of the simplest mathematical expressions we could write is something like +  ,Þ The figure
below is a binary tree that represents this simple expression.

                                                     


                                               +             ,

What are called nodes in our tree will be drawn as circles whose content describes the node. In the
above simple tree there are three nodes. The top node in any binary tree is called the root node. In the
above tree the root node represents the operation of addition. The bottom two nodes are called leaf
nodes and they represent the variables + and ,. Since addition is commutative, the left-right order of the
nodes + and , is not important. However, since subtraction and division and exponentiation are not
commutative, we will show one standard way for drawing trees for expressions like B  C and 7 ƒ 8
and :; . Note that the exponential expression :; is often written as : ^ ; where the up-arrow ^ represents
the exponentiation operation.

                                                     ƒ                         ^




                     B           C                           8            :          ;
                                                7




                                                    page 1
The next expression for which we draw a parse tree is the expression: +  ,  - ƒ .Þ The entire tree for
this expression is made by first drawing the simple trees for the two subexpressions +  , and - ƒ . and
then combining these two subtrees with the middle addition operation. The final resulting tree looks
like:
                                                   


                                                             ƒ

                                         
                                                         -         .

                                    +           ,

The top or root node in this case is the middle addition operation. The root node has two child nodes that
can be considered as subtrees. The left child node of the root represents another addition operation for
the +  , sum while the right child of the root node represents the division operation.


binary operations. If we wanted to draw the tree that represents =38ŠÈ+#  ,# ‹ we would need three
By combining subtrees we can build more complicated trees. So far all of our non-leaf nodes have been


unary operations. The first unary operation is the trigonometric function WMR and the second is WUVX
which represents the square root, and the third would be WUV for the squaring operation. In this

for =38ŠÈ+#  ,# ‹ is shown below. Note how each unary operation has only one child, the subtree that
example we consider squaring as its own unary operation distinct from exponentiation. The parse tree


represents what that operation operates on. Be sure to make a distinction between WUVX and WUVÞ
Also note that parentheses are not part of any node in the tree.


                                                WMR




                                               WUVX



                                                     


                                                             WUV
                                        WUV



                                          +                   ,



                                                    page 2
As yet another example of a parse tree, consider the mathematical expression:

                          $ÐB  'Ñ  691ˆ&  =38ˆÈkB  Ck ‰‰  %aB  #b$


To represent this expression we introduce three new unary operators. The logarithm function is denoted
by PSK and the absolute value function will be denoted by EFW and the unary negation operator that
appears in the exponent for B will be denoted by R IKÞ Note that multiplication is a binary operation
that is represented by the dot † . The parse tree for this expression appears below.



                                                 


                                         
                                                                       †

                                 †               PSK
                                                               %               ^

                                                                      
                           $                         
                                 B       '                                         RIK
                                                                   B       #
                                             &
                                                         WMR                        $


                                                     WUVX



                                                         EFW


                                                          

                                                     B         C




Again note that grouping symbols do not appear anywhere in the tree. Also note that only variables and
constants appear as the bottom-most leaf nodes in the tree. All the interior tree nodes are either unary
operators or binary operations.




                                                     page 3
Although we have already noted that parentheses never appear as any part of any parse tree, the next
two examples show how parentheses used in different ways result in different parse trees. The parse tree
on the left is for the expression # † Ð$ † Ð% † Ð& † 'ÑÑÑ while the parse tree on the right is for the expression
ÐÐÐ# † $Ñ † %Ñ † &Ñ † 'Þ


                                   †                                                †


                               #        †                                       †       '

                                    $       †                               †       &

                                        %       †                       †       %


                                            &       '           #           $



We can tell at a glance the difference between these two tree structures. These two trees are not
isomorphic to each other even though both trees represent the same expression that could be written
without any parentheses as # † $ † % † & † 'Þ

All of the previous examples of trees have represented mathematical expressions. The next example
shows that parse trees can also be applied to logical expressions from sentential calculus, a branch of
symbolic logic. For the next parse tree example, the symbol c stands for NOT, ” stands for OR, and
 • stands for AND while Ê and Í stand for the CONDITIONAL and BICONDITIONAL
respectively. Then we can make the following parse tree that represents the symbolic logic expression:

                                        ÐP • cQÑ Ê aR Í ÐP ” QÑbÞ


                                                         Ê


                                                •                Í

                                            T       c       V           ”

                                                    U               T       U




By now you should be gaining a better idea about how to construct a parse tree for any mathematical or
logical expression. Just to test your full understanding, try to write down the mathematical expression
that corresponds to the following parse tree.



                                                        page 4
ƒ


                                                                                       †
                                                   „

                                                                           #                    +

                                   RIK                 WUVX


                                       ,                       


                                                   WUV                         †
                                                                                           †
                                                                       %
                                                       ,                           +           -



                             Calculations Using Parse Trees
Next we will learn how parse trees can be used to perform mathematical calculations of the expressions
they represent. Consider the quadratic expression: +B#  ,B  - . The tree structure below is how this
expression could be “parsed” inside a computer. In this case we have replaced the unary operator for
squaring with a simple multiplication operation. The numbering of the nodes in the tree shown below is
completely arbitrary. We are only using the numbers as a means of uniquely identifying the various
nodes because we have multiple nodes with  , and † and B contents.
                                                                       1
                                                                           

                                                           2
                                                                                      -       11


                                               3                       9       †
                                                   †
                                                                                           10
                                                               8
                                                                   ,                   B
                                   4   +               5
                                                           †

                                           6
                                               B                   B       7




                                                           page 5
A binary tree is a recursive data structure and one of the most powerful ideas in computer science is a
recursive function that acts over a tree. There are only 3 different recursive functions that can be written
to “traverse” any binary tree like the one shown above. By traversing we mean that we always start at
the root node and visit all the nodes in the tree just once. The connecting lines between the nodes dictate
the paths we take to move from one node to another. These recursive functions are also sometimes
considered as algorithms and they have the names PRE-ORDER, POST-ORDER and IN-ORDER.

In the PRE-ORDER algorithm you visit a node before you visit its children. In the POST-ORDER
algorithm you visit the children of a node before you visit the node itself. In the IN-ORDER algorithm
you visit the left child first, then you visit the node, and finally you visit the right child. The three orders
for the above quadratic tree are summarized in the next three tables below. The *'s represent the binary
multiplication operation. In this case we prefer using the * over the dot † for multiplication.


    PRE-ORDER             visitation time order-->       1           2       3       4       5   6    7       8    9    10    11
 1. Visit the node            node content-->                              ‡       +       ‡   B    B       ‡    ,     B     -
 2. Visit the children        node number-->             1           2       3       4       5   6    7       9    8    10    11


    POST-ORDER            visitation time order-->       1       2       3       4       5   6    7       8       9     10    11
 1. Visit the children        node content-->            +       B       B       ‡       ‡   ,   B        ‡             -    
 2. Visit the node            node number-->             %       '       (       &       $   8   "!       9       #     ""    "


    IN-ORDER             visitation time order-->    1       2       3       4       5       6   7    8       9        10    11
 1. Visit left child         node content-->         +       ‡       B       ‡       B          ,    ‡       B              -
 2. Visit the node           node number-->          %       $       '       &       (       #   8    9       "!        "    ""
 3. Visit right child


When you read across the middle row of each table you should note that only the IN-ORDER table
gives the output for the expression as a normal human being would read it. But you should also note that
for the purposes of computation, the POST-ORDER row is even more valuable. Consider the following
as an application of the post-order algorithm where the calculations are carried out in a stack whose
elements are named ß ] ß and ^Þ A stack is an example of a Last-In-First-Out structure that can be
compared to a Dixie Cup dispenser.

When you read a variable, it is like marking that variable name on a Dixie Cup and pushing the cup up
onto the bottom of a stack of Dixie cups. When you read a binary operation, the effect is as if you pull
down the last two Dixie cups off the stack as the operands for that operation. You compute the operation
answer and replace the two Dixie cups with one Dixie cup that holds the answer to the operation. Note
that in this manner only math subexpressions appear as Dixie cups. In the table below we can think that
ß ] ß and ^ are three Dixie Cup positions, not the Dixie cups themselves.




                                                     page 6
A stack with only three elements high is all that is required to evaluate the above quadratic tree. We read
the elements going across the middle row of the POST-ORDER table. The first three rows of the table
below show the contents of the stack as the calculation progresses through reading operands and
operators. The read order is the same as the node content order in the middle row of the above POST-
ORDER table. To make the read order perfectly clear we have labeled the time order as the last row in
the table. The table below shows exactly what takes place inside a Reverse Polish Logic calculator when
it calculates the expression +B#  ,B  -Þ

       ^                      +                       +B#
       ]                  +   B   +           +B#      ,     +B#              +B#  ,B
                    +    B   B   B#   +B#     ,       B     ,B    +B#  ,B       -       +B#  ,B  -

 read order p        +   B    B    *    *      ,       B      *       +          -              +

 time order p    0   1    2   3    4    5      6       7      8       9          10            11


You might note that only those trees all of whose nodes are binary operations with complete left and
right child nodes can have the IN-ORDER algorithm applied to them. Any unary operator can only have
either the PRE-ORDER or POST-ORDER algorithm applied to it.

For the remaining parts of this paper we assume you have both an interest in and a familiarity with a
computer language that can employ recursive functions and procedures, if not also some object oriented
facilities. Rest assured that PASCAL, C++, and JAVA qualify as decent languages in these respects.
Sorry, if you are only familiar with BASIC or FORTRAN, two languages that have outlived any real
usefulness. We prefer to give code examples in PASCAL if only because this language is excellent at
exposing algorithms and was designed by a mathematician and named after a mathematician. Our
second choice of a language would be JAVA. As a language, C++ would be our distant third choice.
Both PASCAL and JAVA have the advantage that they were designed by language designers. No
further comments about C++ would endear us with anyone who prefers that language.

Although we are going to show pseudo PASCAL code, we cannot emphasize enough that if you know
how to program in a modern language then by all means you should write and test programs to illustrate
for yourself what is going on under the hood. Only by writing and testing code can you fully appreciate
what we are describing.

Assuming a tree node has the following structure we can write the three functions to evaluate the
quadratic expression tree using the three tree-traversal orders. The following code is pseudo PASCAL.
Note that each function calls itself from within itself. That is why these three functions are called
recursive functions and that is why the tree structures they operate on are called recursive data
structures.

ATreeNode
  NodeName   : string
  LeftChild : NodePointer
  RightChild : NodePointer



                                                    page 7
procedure PreOrder(TreeNode : NodePointer);
begin
  Output(TreeNode.NodeName);
  if TreeNode.LeftChild<>nil then PreOrder(TreeNode.LeftChild);
  if TreeNode.RightChild<>nil then PreOrder(TreeNode.RightChild);
end;


procedure PostOrder(TreeNode : TreeNode);
begin
  if TreeNode.LeftChild<>nil then PostOrder(TreeNode.LeftChild);
  if TreeNode.RightChild<>nil then PostOrder(TreeNode.RightChild);
  Output(TreeNode.NodeName);
end;


procedure InOrder(TreeNode : TreeNode);
begin
  if TreeNode.LeftChild<>nil then InOrder(TreeNode.LeftChild);
  Output(TreeNode.NodeName);
  if TreeNode.RightChild<>nil then InOrder(TreeNode.RightChild);
end;


If you were to execute these functions where the initial input was the root node of the above quadratic
parse tree and if each time a node was Output, we just printed the node contents then you would
generate the middle row in each of the above three tables with the names PRE-ORDER, POST-ORDER,
and IN-ORDER.

The last two code examples that we give illustrate how you could build a function to evaluate any
mathematical or logical expression tree. Such a function is one of two key elements required to actually
compute a result based on the expression the tree represents. The other key element is a program that
actually builds the parse tree, but such a program is beyond the scope of this paper.

First, the mathematical expression evaluator function. As you will note, this function is a recursive
function since it calls itself within itself. We only show a limited set of both binary and unary operators.
But once you understand how the code works, you could extend this function to make it work with all
the common math operators that are found on any scientific calculator. There are about 40 such common
operators.

We now expand the definition of the ATreeNode structure to include the following fields. A
NodePointer is a variable that points to ATreeNode and NodePointerType is a type of variable that can
point to a tree node.

ATreeNode
  NodeType     : (Add,Subtract,Multiply,Divide,Power,AbsValue,Log,Negation,Sine,
                  Square,SquareRoot,XVariable,Constant);
  LeftChild    : NodePointer;
  RightChild   : NodePointer;
  UnaryChild   : NodePointer;
  ConstantData : float;



                                                  page 8
The ConstantData field holds the floating point value of those nodes that are leaf node constants. For
an expression as simple as X+3 it would be the node representing the constant number 3 that would hold
the value 3 in the ConstantData field. In this case the OperatorName for that node would be Constant.
Note that the node that represents the variable X need not hold the floating point value for X. Only
Constant nodes make use of the ConstantData field.

You call the function EvaluateNode with two parameters. Assuming your expression has the variable X
as its only variable, the first parameter is the floating point value of X. The second parameter is the root
node of the entire tree. The function returns the floating point value that represents the entire expression.
This single function is all that is required to compute any mathematical expression represented by any
parse tree, no matter how big or complex the parse tree.

function EvaluateNode(X           : float;
                      NodePointer : NodePointerType) : float;
var RightTemp : float;
     LeftTemp : float;
     UnaryTemp : float;
begin
  with NodePointer do
    begin
      case NodeType of
        Add        : EvaluateNode := EvaluateNode(X,LeftChild) + EvaluateNode(X,RightChild);
        Subtract   : EvaluateNode := EvaluateNode(X,LeftChild) - EvaluateNode(X,RightChild);
        Multiply   : EvaluateNode := EvaluateNode(X,LeftChild)*EvaluateNode(X, RightChild);
        Divide     : begin
                       RightTemp := EvaluateNode(X,RightChild);
                       if (RightTemp = 0.0) then ErrorMessage := 'Divison by 0'
                         else EvaluateNode := EvaluateNode(X,LeftChild)/RightTemp
                     end;
        Power      : begin
                       LeftTemp := EvaluateNode(X,LeftChild);
                       RightTemp := EvaluateNode(X,RightChild);
                       if LeftTemp <= 0.0 then ErrorMessage := 'Improper base'
                         else EvaluateNode := exp(RightTemp*ln(LeftTemp))
                     end;
        AbsValue   : EvaluateNode := abs(EvaluateNode(X,UnaryChild));
        Log        : begin
                       UnaryTemp := EvaluateNode(X,UnaryChild);
                       if (UnaryTemp <= 0.0) then ErrorMessage := 'Log(X) logarithm';
                         else EvaluateNode := Log(UnaryTemp)
        Negation   : EvaluateNode := -EvaluateNode(X,UnaryChild);
        Sine       : EvaluateNode := sin(EvaluateNode(X,UnaryChild));
        Square     : EvaluateNode := sqr(EvaluateNode(X,UnaryChild));
        SquareRoot : begin
                       UnaryTemp := EvaluateNode(X,UnaryChild);
                       if (UnaryTemp < 0.0) then ErrorMessage := 'Square root';
                         else EvaluateNode := sqrt(UnaryTemp)
                     end;
        XVariable : EvaluateNode := X;
        Constant   : EvaluateNode := ConstantData
      end
    end
end; {function EvaluateNode}




                                                   page 9
The last function we write is one to evaluate logical expressions. Since there are fewer logical operators
this function seems simpler than the one above for math expressions. However, both functions are very
similar in nature.

In a logical expression we will normally have multiple variables so we assume there are global boolean
variables named PVariableTruthValue, QVariableTruthValue and RVariableTruthValue that hold
the boolean values of variables with the names P, Q and R. These global variables would be assigned
their respective boolean truth values before this function would get called.

This function is called only once with the root node of the entire logical expression as its only input
parameter. This function returns the boolean value that represents the truth value for the entire
expression.


ALogicNode
   NodeType      : (LogicOR, LogicAND, Implies, IfOnlyIf, LogicNOT, VariableP,
                    VariableQ, VariableR, Constant)à
    RightChild   : NodePointer;
    LeftChild    : NodePointer;
    UnaryChild   : NodePointer;
    ConstantData : boolean;


function EvaluateNode(NodePointer :               NodePointerType) : boolean;
begin
  with NodePointer do
    begin
      case NodePointer.NodeType of
        LogicOR   : EvaluateNode :=               EvaluateNode(LeftChild) or EvaluateNode(RightChild);
        LogicAND : EvaluateNode :=                EvaluateNode(LeftChild) and EvaluateNode(RightChild);
        Implies   : EvaluateNode :=               not (EvaluateNode(LeftChild) and
                                                    (not EvaluateNode(RightChild)));
        IfOnlyIf : EvaluateNode              :=   EvaluateNode(LeftChild) = EvaluateNode(RightChild);
        LogicNOT : EvaluateNode              :=   not EvaluateNode(UnaryChild);
        VariableP : EvaluateNode             :=   PVariableTruthValue;
        VariableQ : EvaluateNode             :=   QVariableTruthValue;
        VariableR : EvaluateNode             :=   RVariableTruthValue;
        Constant : EvaluateNode              :=   ConstantBooleanValue;
      end;
    end;
end; {function EvaluateNode}


Except for the names, and number of logical variables, the above function is all that is needed to compute all the
values to fill in any truth table for any logical expression, no matter how large or complicated the expression.




                                                     page 10

Contenu connexe

Dernier

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 

Dernier (20)

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 

En vedette

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

En vedette (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

Parsetrees

  • 1. Parse Trees by John Kennedy Mathematics Department Santa Monica College 1900 Pico Blvd. Santa Monica, CA 90405 rkennedy@ix.netcom.com
  • 2. Except for this comment explaining that it is blank for some deliberate reason, this page is intentionally blank!
  • 3. Parse Trees The process whereby a computer compiler takes parts of human written source code and produces an internal structure in memory that represents the correct parts of a program that can be executed is what we call Parsing. This paper will demonstrate how to create parse trees on paper that represent well- formed mathematical formulas or expressions. We then show some examples of recursive functions that operate on those parse trees. It is these recursive functions that justify the importance of parse trees in the first place. Since most readers probably don't have sufficient programming expertise, this paper does not explain how to create parse trees programmatically. This in itself is another fascinating topic worthy of a more advanced paper. However, the current paper will have served its purpose if it motivates the reader to further investigate the use of parse trees in any application domain, let alone the use of trees in general. Mathematical expressions represent only a very small part of any computer language, but they also involve the more intricate parts of the grammars that define a language. While we won't discuss the formal grammar of any particular language, we mention that most modern computer languages such as FORTRAN, BASIC, C++, PASCAL, and JAVA all handle and represent mathematical expressions by internally using the equivalent of binary trees. For this reason it is worthwhile to learn the relationship between mathematical expressions and binary trees. First you should try to understand that the trees we are going to create are recursive data structures. They are recursive in a sense that will become more clear as we gain some experience and show some program code. But first we should show several examples of parse trees before we show what to do with them. One of the simplest mathematical expressions we could write is something like +  ,Þ The figure below is a binary tree that represents this simple expression.  + , What are called nodes in our tree will be drawn as circles whose content describes the node. In the above simple tree there are three nodes. The top node in any binary tree is called the root node. In the above tree the root node represents the operation of addition. The bottom two nodes are called leaf nodes and they represent the variables + and ,. Since addition is commutative, the left-right order of the nodes + and , is not important. However, since subtraction and division and exponentiation are not commutative, we will show one standard way for drawing trees for expressions like B  C and 7 ƒ 8 and :; . Note that the exponential expression :; is often written as : ^ ; where the up-arrow ^ represents the exponentiation operation.  ƒ ^ B C 8 : ; 7 page 1
  • 4. The next expression for which we draw a parse tree is the expression: +  ,  - ƒ .Þ The entire tree for this expression is made by first drawing the simple trees for the two subexpressions +  , and - ƒ . and then combining these two subtrees with the middle addition operation. The final resulting tree looks like:  ƒ  - . + , The top or root node in this case is the middle addition operation. The root node has two child nodes that can be considered as subtrees. The left child node of the root represents another addition operation for the +  , sum while the right child of the root node represents the division operation. binary operations. If we wanted to draw the tree that represents =38ŠÈ+#  ,# ‹ we would need three By combining subtrees we can build more complicated trees. So far all of our non-leaf nodes have been unary operations. The first unary operation is the trigonometric function WMR and the second is WUVX which represents the square root, and the third would be WUV for the squaring operation. In this for =38ŠÈ+#  ,# ‹ is shown below. Note how each unary operation has only one child, the subtree that example we consider squaring as its own unary operation distinct from exponentiation. The parse tree represents what that operation operates on. Be sure to make a distinction between WUVX and WUVÞ Also note that parentheses are not part of any node in the tree. WMR WUVX  WUV WUV + , page 2
  • 5. As yet another example of a parse tree, consider the mathematical expression: $ÐB  'Ñ  691ˆ&  =38ˆÈkB  Ck ‰‰  %aB  #b$ To represent this expression we introduce three new unary operators. The logarithm function is denoted by PSK and the absolute value function will be denoted by EFW and the unary negation operator that appears in the exponent for B will be denoted by R IKÞ Note that multiplication is a binary operation that is represented by the dot † . The parse tree for this expression appears below.   † † PSK % ^   $  B ' RIK B # & WMR $ WUVX EFW  B C Again note that grouping symbols do not appear anywhere in the tree. Also note that only variables and constants appear as the bottom-most leaf nodes in the tree. All the interior tree nodes are either unary operators or binary operations. page 3
  • 6. Although we have already noted that parentheses never appear as any part of any parse tree, the next two examples show how parentheses used in different ways result in different parse trees. The parse tree on the left is for the expression # † Ð$ † Ð% † Ð& † 'ÑÑÑ while the parse tree on the right is for the expression ÐÐÐ# † $Ñ † %Ñ † &Ñ † 'Þ † † # † † ' $ † † & % † † % & ' # $ We can tell at a glance the difference between these two tree structures. These two trees are not isomorphic to each other even though both trees represent the same expression that could be written without any parentheses as # † $ † % † & † 'Þ All of the previous examples of trees have represented mathematical expressions. The next example shows that parse trees can also be applied to logical expressions from sentential calculus, a branch of symbolic logic. For the next parse tree example, the symbol c stands for NOT, ” stands for OR, and • stands for AND while Ê and Í stand for the CONDITIONAL and BICONDITIONAL respectively. Then we can make the following parse tree that represents the symbolic logic expression: ÐP • cQÑ Ê aR Í ÐP ” QÑbÞ Ê • Í T c V ” U T U By now you should be gaining a better idea about how to construct a parse tree for any mathematical or logical expression. Just to test your full understanding, try to write down the mathematical expression that corresponds to the following parse tree. page 4
  • 7. ƒ † „ # + RIK WUVX ,  WUV † † % , + - Calculations Using Parse Trees Next we will learn how parse trees can be used to perform mathematical calculations of the expressions they represent. Consider the quadratic expression: +B#  ,B  - . The tree structure below is how this expression could be “parsed” inside a computer. In this case we have replaced the unary operator for squaring with a simple multiplication operation. The numbering of the nodes in the tree shown below is completely arbitrary. We are only using the numbers as a means of uniquely identifying the various nodes because we have multiple nodes with  , and † and B contents. 1  2  - 11 3 9 † † 10 8 , B 4 + 5 † 6 B B 7 page 5
  • 8. A binary tree is a recursive data structure and one of the most powerful ideas in computer science is a recursive function that acts over a tree. There are only 3 different recursive functions that can be written to “traverse” any binary tree like the one shown above. By traversing we mean that we always start at the root node and visit all the nodes in the tree just once. The connecting lines between the nodes dictate the paths we take to move from one node to another. These recursive functions are also sometimes considered as algorithms and they have the names PRE-ORDER, POST-ORDER and IN-ORDER. In the PRE-ORDER algorithm you visit a node before you visit its children. In the POST-ORDER algorithm you visit the children of a node before you visit the node itself. In the IN-ORDER algorithm you visit the left child first, then you visit the node, and finally you visit the right child. The three orders for the above quadratic tree are summarized in the next three tables below. The *'s represent the binary multiplication operation. In this case we prefer using the * over the dot † for multiplication. PRE-ORDER visitation time order--> 1 2 3 4 5 6 7 8 9 10 11 1. Visit the node node content-->   ‡ + ‡ B B ‡ , B - 2. Visit the children node number--> 1 2 3 4 5 6 7 9 8 10 11 POST-ORDER visitation time order--> 1 2 3 4 5 6 7 8 9 10 11 1. Visit the children node content--> + B B ‡ ‡ , B ‡  -  2. Visit the node node number--> % ' ( & $ 8 "! 9 # "" " IN-ORDER visitation time order--> 1 2 3 4 5 6 7 8 9 10 11 1. Visit left child node content--> + ‡ B ‡ B  , ‡ B  - 2. Visit the node node number--> % $ ' & ( # 8 9 "! " "" 3. Visit right child When you read across the middle row of each table you should note that only the IN-ORDER table gives the output for the expression as a normal human being would read it. But you should also note that for the purposes of computation, the POST-ORDER row is even more valuable. Consider the following as an application of the post-order algorithm where the calculations are carried out in a stack whose elements are named ß ] ß and ^Þ A stack is an example of a Last-In-First-Out structure that can be compared to a Dixie Cup dispenser. When you read a variable, it is like marking that variable name on a Dixie Cup and pushing the cup up onto the bottom of a stack of Dixie cups. When you read a binary operation, the effect is as if you pull down the last two Dixie cups off the stack as the operands for that operation. You compute the operation answer and replace the two Dixie cups with one Dixie cup that holds the answer to the operation. Note that in this manner only math subexpressions appear as Dixie cups. In the table below we can think that ß ] ß and ^ are three Dixie Cup positions, not the Dixie cups themselves. page 6
  • 9. A stack with only three elements high is all that is required to evaluate the above quadratic tree. We read the elements going across the middle row of the POST-ORDER table. The first three rows of the table below show the contents of the stack as the calculation progresses through reading operands and operators. The read order is the same as the node content order in the middle row of the above POST- ORDER table. To make the read order perfectly clear we have labeled the time order as the last row in the table. The table below shows exactly what takes place inside a Reverse Polish Logic calculator when it calculates the expression +B#  ,B  -Þ ^ + +B# ] + B + +B# , +B# +B#  ,B + B B B# +B# , B ,B +B#  ,B - +B#  ,B  - read order p + B B * * , B * + - + time order p 0 1 2 3 4 5 6 7 8 9 10 11 You might note that only those trees all of whose nodes are binary operations with complete left and right child nodes can have the IN-ORDER algorithm applied to them. Any unary operator can only have either the PRE-ORDER or POST-ORDER algorithm applied to it. For the remaining parts of this paper we assume you have both an interest in and a familiarity with a computer language that can employ recursive functions and procedures, if not also some object oriented facilities. Rest assured that PASCAL, C++, and JAVA qualify as decent languages in these respects. Sorry, if you are only familiar with BASIC or FORTRAN, two languages that have outlived any real usefulness. We prefer to give code examples in PASCAL if only because this language is excellent at exposing algorithms and was designed by a mathematician and named after a mathematician. Our second choice of a language would be JAVA. As a language, C++ would be our distant third choice. Both PASCAL and JAVA have the advantage that they were designed by language designers. No further comments about C++ would endear us with anyone who prefers that language. Although we are going to show pseudo PASCAL code, we cannot emphasize enough that if you know how to program in a modern language then by all means you should write and test programs to illustrate for yourself what is going on under the hood. Only by writing and testing code can you fully appreciate what we are describing. Assuming a tree node has the following structure we can write the three functions to evaluate the quadratic expression tree using the three tree-traversal orders. The following code is pseudo PASCAL. Note that each function calls itself from within itself. That is why these three functions are called recursive functions and that is why the tree structures they operate on are called recursive data structures. ATreeNode NodeName : string LeftChild : NodePointer RightChild : NodePointer page 7
  • 10. procedure PreOrder(TreeNode : NodePointer); begin Output(TreeNode.NodeName); if TreeNode.LeftChild<>nil then PreOrder(TreeNode.LeftChild); if TreeNode.RightChild<>nil then PreOrder(TreeNode.RightChild); end; procedure PostOrder(TreeNode : TreeNode); begin if TreeNode.LeftChild<>nil then PostOrder(TreeNode.LeftChild); if TreeNode.RightChild<>nil then PostOrder(TreeNode.RightChild); Output(TreeNode.NodeName); end; procedure InOrder(TreeNode : TreeNode); begin if TreeNode.LeftChild<>nil then InOrder(TreeNode.LeftChild); Output(TreeNode.NodeName); if TreeNode.RightChild<>nil then InOrder(TreeNode.RightChild); end; If you were to execute these functions where the initial input was the root node of the above quadratic parse tree and if each time a node was Output, we just printed the node contents then you would generate the middle row in each of the above three tables with the names PRE-ORDER, POST-ORDER, and IN-ORDER. The last two code examples that we give illustrate how you could build a function to evaluate any mathematical or logical expression tree. Such a function is one of two key elements required to actually compute a result based on the expression the tree represents. The other key element is a program that actually builds the parse tree, but such a program is beyond the scope of this paper. First, the mathematical expression evaluator function. As you will note, this function is a recursive function since it calls itself within itself. We only show a limited set of both binary and unary operators. But once you understand how the code works, you could extend this function to make it work with all the common math operators that are found on any scientific calculator. There are about 40 such common operators. We now expand the definition of the ATreeNode structure to include the following fields. A NodePointer is a variable that points to ATreeNode and NodePointerType is a type of variable that can point to a tree node. ATreeNode NodeType : (Add,Subtract,Multiply,Divide,Power,AbsValue,Log,Negation,Sine, Square,SquareRoot,XVariable,Constant); LeftChild : NodePointer; RightChild : NodePointer; UnaryChild : NodePointer; ConstantData : float; page 8
  • 11. The ConstantData field holds the floating point value of those nodes that are leaf node constants. For an expression as simple as X+3 it would be the node representing the constant number 3 that would hold the value 3 in the ConstantData field. In this case the OperatorName for that node would be Constant. Note that the node that represents the variable X need not hold the floating point value for X. Only Constant nodes make use of the ConstantData field. You call the function EvaluateNode with two parameters. Assuming your expression has the variable X as its only variable, the first parameter is the floating point value of X. The second parameter is the root node of the entire tree. The function returns the floating point value that represents the entire expression. This single function is all that is required to compute any mathematical expression represented by any parse tree, no matter how big or complex the parse tree. function EvaluateNode(X : float; NodePointer : NodePointerType) : float; var RightTemp : float; LeftTemp : float; UnaryTemp : float; begin with NodePointer do begin case NodeType of Add : EvaluateNode := EvaluateNode(X,LeftChild) + EvaluateNode(X,RightChild); Subtract : EvaluateNode := EvaluateNode(X,LeftChild) - EvaluateNode(X,RightChild); Multiply : EvaluateNode := EvaluateNode(X,LeftChild)*EvaluateNode(X, RightChild); Divide : begin RightTemp := EvaluateNode(X,RightChild); if (RightTemp = 0.0) then ErrorMessage := 'Divison by 0' else EvaluateNode := EvaluateNode(X,LeftChild)/RightTemp end; Power : begin LeftTemp := EvaluateNode(X,LeftChild); RightTemp := EvaluateNode(X,RightChild); if LeftTemp <= 0.0 then ErrorMessage := 'Improper base' else EvaluateNode := exp(RightTemp*ln(LeftTemp)) end; AbsValue : EvaluateNode := abs(EvaluateNode(X,UnaryChild)); Log : begin UnaryTemp := EvaluateNode(X,UnaryChild); if (UnaryTemp <= 0.0) then ErrorMessage := 'Log(X) logarithm'; else EvaluateNode := Log(UnaryTemp) Negation : EvaluateNode := -EvaluateNode(X,UnaryChild); Sine : EvaluateNode := sin(EvaluateNode(X,UnaryChild)); Square : EvaluateNode := sqr(EvaluateNode(X,UnaryChild)); SquareRoot : begin UnaryTemp := EvaluateNode(X,UnaryChild); if (UnaryTemp < 0.0) then ErrorMessage := 'Square root'; else EvaluateNode := sqrt(UnaryTemp) end; XVariable : EvaluateNode := X; Constant : EvaluateNode := ConstantData end end end; {function EvaluateNode} page 9
  • 12. The last function we write is one to evaluate logical expressions. Since there are fewer logical operators this function seems simpler than the one above for math expressions. However, both functions are very similar in nature. In a logical expression we will normally have multiple variables so we assume there are global boolean variables named PVariableTruthValue, QVariableTruthValue and RVariableTruthValue that hold the boolean values of variables with the names P, Q and R. These global variables would be assigned their respective boolean truth values before this function would get called. This function is called only once with the root node of the entire logical expression as its only input parameter. This function returns the boolean value that represents the truth value for the entire expression. ALogicNode NodeType : (LogicOR, LogicAND, Implies, IfOnlyIf, LogicNOT, VariableP, VariableQ, VariableR, Constant)à RightChild : NodePointer; LeftChild : NodePointer; UnaryChild : NodePointer; ConstantData : boolean; function EvaluateNode(NodePointer : NodePointerType) : boolean; begin with NodePointer do begin case NodePointer.NodeType of LogicOR : EvaluateNode := EvaluateNode(LeftChild) or EvaluateNode(RightChild); LogicAND : EvaluateNode := EvaluateNode(LeftChild) and EvaluateNode(RightChild); Implies : EvaluateNode := not (EvaluateNode(LeftChild) and (not EvaluateNode(RightChild))); IfOnlyIf : EvaluateNode := EvaluateNode(LeftChild) = EvaluateNode(RightChild); LogicNOT : EvaluateNode := not EvaluateNode(UnaryChild); VariableP : EvaluateNode := PVariableTruthValue; VariableQ : EvaluateNode := QVariableTruthValue; VariableR : EvaluateNode := RVariableTruthValue; Constant : EvaluateNode := ConstantBooleanValue; end; end; end; {function EvaluateNode} Except for the names, and number of logical variables, the above function is all that is needed to compute all the values to fill in any truth table for any logical expression, no matter how large or complicated the expression. page 10