Nama : Alvin Theodora
NIM : 1801428434
Pada tanggal 15 Maret lalu, kami melakukan sebuah charity event untuk saudara-saudara kita yang terkena penyakit kusta / pernah terkena penyakit kusta yang diselenggarakan oleh BINUS University.
Kesan saya setelah mengikuti acara tersebut adalah saya sangat terkesan atas kepedulian orang - orang di sekitar saya karena mereka perduli terhadap sesama dan mau membantu sesama yang sedang kesusahan atau membutuhkan bantuan.
Pesan saya juga terhadap semua panitia dan peserta pada event tersebut, semoga apa yang sudah kita lakukan dapat direalisasikan dan ditargetkan kepada orang-orang yang memang membutuhkan pertolongan, dan juga semoga charity event seperti ini dapat terus dilakukan karena ini merupakan tindakan yang positif bagi diri sendiri maupun untuk orang lain.
Penyakit kusta merupakan penyakit yang disebabkan oleh bakteri dan dalam jangka waktu yang lama, dapat merusak sistem saraf, kulit, anggota gerak, maupun mata. Namun, penyakit kusta dapat dicegah dengan cara mengetahui gejala-gejalanya, oleh karena itu sosialisasi yang baik dari berbagai pihak pun perlu diterapkan agar masyarakat mengetahui betul tentang gejala-gejala dari penyakit kusta, sehingga penyakit ini dapat dicegah penyebarannya.
Event Run For Leprosy ini pun dapat membantu saudara-saudara kita yang memang membutuhkan pertolongan, dan semoga charity event ini dapat digunakan sebaik-baiknya untuk pengobatan, penyuluhan, dan cara-cara lainnya untuk menolong sesama kita.
Saturday, March 21, 2015
Monday, January 5, 2015
Assignment 9 Programming Language Concepts
Name : Alvin Theodora
Consider the following skeletal example:if . . .
def fun(. . .):
. . .
else
def fun(. . .):
. . .
I think such user-defined operator overloading is good as long as user use it according to its logical rules. User must use for example, + operator to be overloaded to implement “add” not “substraction”. And sometimes, in C++ there is condition when user need to add many data in class, so user-defined operator like this is needed to make it easier.
int temp;
temp = a;
a = b;
b = temp;
}
void main() {
int value = 2, list[5] = {1, 3, 5, 7, 9};
swap(value, list[0]);
swap(list[0], list[1]);
swap(value, list[value]);
}
For each of the following parameter-passing methods, what are all of the values of the variables value and list after each of the three calls to swap?
a. Passed by value
b. Passed by reference
c. Passed by value-result
=
NIM : 1801428434
Here is the ninth assignment of Programming Language Concepts course. The question is taken from "Concepts of Programming Language, 10th edition" from Robert W. Sebesta in chapter 9:
Review Questions
1. What are the three general characteristics of
subprograms?
=
-
Each subprogram has a single entry point.
- The calling program unit is suspended during
the execution of the called subprogram, which implies that there is only
subprogram in execution at any given time.
- Control always returns to the caller when the subprogram execution terminates.
- Control always returns to the caller when the subprogram execution terminates.
2. What does it mean for a subprogram to be active?
= . It
means that after having been called, a subprogram has begun execution but has
not yet completed that execution.
3. What is given in the header of a subprogram.
= subprogram header,
which is the first part of the definition, serves several purposes. First, it
specifies that the following syntactic unit is a subprogram definition of some
particular kind.1 In languages that have more than one kind of subprogram, the
kind of the subprogram is usually specified with a special word. Second, if the
subprogram is not anonymous, the header provides a name for the subprogram.
Third, it may optionally specify a list of parameters.
4. What characteristic of Python subprograms sets
them apart from those of other languages?
=
One characteristic of Python functions that sets
them apart from the functions of other common programming languages is that
function def statements are executable. When a def statement is executed, it
assigns the given name to the given function body. Until a function’s def has
been executed, the function cannot be called.Consider the following skeletal example:if . . .
def fun(. . .):
. . .
else
def fun(. . .):
. . .
5. What languages allow a variable number of
parameters ?
=
C,C++,Perl JavaScript, and Lua. Also, C#
allows methods to accept a variable number of parameters, as long as they are
of the same type.Problem Set
1. What are arguments for and against a user program building additional
definitions for existing operators, as can be done in Python and C++? Do you
think such user-defined operator overloading is good or bad? Support your
answer.
= FOR:
It allows the developer to program using notation “closer to the target domain”
and allows user-defined types a similar level of syntactic support as types
built into the language. It can easily be emulated using function calls.
AGAINST:
It can be implemented
according to user’s want, eventhough it is not logically true.I think such user-defined operator overloading is good as long as user use it according to its logical rules. User must use for example, + operator to be overloaded to implement “add” not “substraction”. And sometimes, in C++ there is condition when user need to add many data in class, so user-defined operator like this is needed to make it easier.
2. . In most Fortran IV implementations, parameters were passed by
reference, using access path transmission only. State both the advantages and
disadvantages of this design choice.
=
The main advantage of this method is the fast accesses to formal
parameters in subprograms. The disadvantages are that recursion is rarely
useful when values cannot be passed, and also that a number of problems, such
as aliasing, occur with the method.
3. . Argue in support of the Ada 83 designers’ decision to allow the
implementor to choose between implementing in out mode parameters by copy or by
reference.
=
The tradeoff is one of efficiency of passing parameters vs. efficiency
of accessing the parameters in the subprogram. Ada leaves this choice to the
implementor, rather than forcing a single solution, because different
situations may require different approaches. Passing a large array which the
subprogram only accesses a few times is faster with reference. Passing any argument
that the subprogram accesses a lot is faster with copy.
4. Suppose you want to write a method that prints a heading on a new output
page, along with a page number that is 1 in the first activation and that
increases by 1 with each subsequent activation. Can this be done without
parameters and without reference to nonlocal variables in Java? Can it be done
in C#?
=
This can be done in both Java and C#, using a static (or class) data
member for the page number.
5. Consider the following program written in C syntax:
void swap(int a, int b) {int temp;
temp = a;
a = b;
b = temp;
}
void main() {
int value = 2, list[5] = {1, 3, 5, 7, 9};
swap(value, list[0]);
swap(list[0], list[1]);
swap(value, list[value]);
}
For each of the following parameter-passing methods, what are all of the values of the variables value and list after each of the three calls to swap?
a. Passed by value
b. Passed by reference
c. Passed by value-result
=
Monday, December 15, 2014
Assignment 8 Programming Language Concepts
Name : Alvin Theodora
= In Ruby, block is a sequence of code,
delimited by either breves or the do and and reserved words.
NIM : 1801428434
Here is the eighth assignment of Programming Language Concepts course. The question is taken from "Concepts of Programming Language, 10th edition" from Robert W. Sebesta in chapter 8:
Review Questions
1. What is the definition of control structure?
= A control structure is a control statement and the
collection of statements whose execution it controls.
2. What did Bohm and Jocopini prove about flowcharts?
= It was proven that all algorithms that can be expressed by
flowcharts can be coded in a programming languages with only two control
statements: one for choosing between two control flow paths and one for
logically controlled iterations.
3. What is the definition of block?
4. What is/are the design issue(s) for all selection and
iteration control statements?
=
Selection
Two-way :
- What is the form and type of the expression that controls the selection ?
- How are the then and else clauses specified ?
- How should the meaning of nested selectors be specified ?
- On which type the selector is based ?
- How is the iteration controlled ?
- Where should the control mechanism appear in loop statement?
5. what are the design issues for selection structures?
=
- What is the form and type of the expression that controls the selection ?
- How are the then and else clauses specified ?
- How should the meaning of nested selectors be specified ?
Problem Set
1. Describe three situation where a combined counting and
logical looping statement is needed.
= A list of values is to be added to a SUM, but the loop is to
be exited if SUM exceeds some prescribed value.
A list of values is to be read into an array, where the
reading is to terminate when either a prescribed number of values have been
read or some special value is found in the list.
The values stored in a linked list are to be moved to an
array, where values are to be moved until the end of the linked list is found
or the array is filled, whichever comes first.
2. Study the iterator feature of CLU in Liskov et al. (1981)
and determine its advantages and disadvantages
= The key addition was the concept of a cluster, CLU’s type
extension system and the root of the language’s name CLUster. Clusters
correspond generally to the concept of an “object” in an OO language, and have
roughly the same syntax.
CLU did not offer any sort of structure for the clusters
themselves. Cluster names are global, and no namespace mechanism was provided
to group clusters or allow them to be created “locally” inside other clusters.
This problem is not unique to CLU, but it is surprising that so many languages
have lacked this feature — given the centralness in ALGOL of giving scope to
variables, it seems that giving scope to cluster/object names would be an
obvious extension.
CLU does not perform implicit type conversions. In a
cluster, the explicit type conversions ‘up’ and ‘down’ change between the
abstract type and the representation. There is a universal type ‘any’, and a
procedure force[] to check that an object is a certain type.
Another key feature of the CLU type system are iterators,
which return objects from a collection one after the other. Iterators were
“black boxes” that offered an identical API no matter what data they were being
used with. Thus the iterator for a collection of complex_numbers would be
identical to that for an array of integers.
CLU also includes exception handling, based on various
attempts in other languages; exceptions are raised using signal and handled
with except. Oddly, given the focus on type design, CLU does not offer
enumerated types, nor any obvious way to create them.
A final distinctive feature in CLU is multiple assignment,
where more than one variable can appear on the left hand side of an assignment
operator
3. Compare the set of Ada control statements with those of C#
and decide which are better and why.
= C# because the C# multiple selection structures is a great
boost to C# writability, with no obvious negatives, furthermore C# control
statement is the most flexible iteration statement.
4. What are the pros and cons of using unique closing reserved
words on compound statements?
= Unique closing keywords on compound statements have the
advantage of readability and the disadvantage of complicating the language by
increasing the number of keywords.
5. What are the arguments, pro and con, for Python’s use of
indentation to specify compound statements in control statements?
=
Pros of indentation:
- Helps reduce inconsistent indentation in code which makes it easier to read (in other words consistency)
- clears the screen by replace visible tokens with whitespace to serve the same purpose
Cons of indentation
- Much easier to cut and paste code to different levels (you don’t have to fix the indentation)
- More consistent. Some text editors display whitespace(s) differently.
- You cannot safely mix tabs and spaces in Python such that it would be easy to cause an error by putting too few spaces in an indentation level, thus going to the previous indentation level and closing the loop/block. This decreases writability.
Monday, December 8, 2014
Assignment 7 Programming Language Concepts
Name : Alvin Theodora
NIM : 1801428434
Here is the seventh assignment of Programming Language Concepts course. The question is taken from "Concepts of Programming Language, 10th edition" from Robert W. Sebesta in chapter 7:
Review Questions
1. Define operator precedence and operator associativity.
=
- Operator precedence: defines order and priority of the operator evaluation from different precedence levels.
- Operator precedence: defines order and priority of the operator evaluation from different precedence levels.
- Operator associativity: defines the order of operators
evaluation when it is from the same precedence level.
2. What is a ternary operator?
= Ternary operator is an operator with three operands.
3. What is a prefix operator?
= Prefix operator is a operator that precede their operands
4. What operator usually has right associativity?
= Operator that usually has right associativity are operator
which can be found in Fortran and Ruby.
5. What is a nonassociative operator?
= Nonassociative
operator means that the expression is illegal.
Problem set:
1. When might you want the compiler to ignore type differences
in an expression?
= When I want to evaluate a string as a number.
2. State your own arguments for and against allowing mixed-mode
arithmetic expressions.
=
- For: A mixed mode arithmetic expression is needed in calculating expressions that might have decimal results. It is compulsory as it allows two different type of number data type such as float and integer to be summed without losing the precision of the float.
- For: A mixed mode arithmetic expression is needed in calculating expressions that might have decimal results. It is compulsory as it allows two different type of number data type such as float and integer to be summed without losing the precision of the float.
- Against: While it is compulsory to have mixed-mode
expressions, it is more error prone when expressions made are more likely to
have non-decimal results. A mixed mode might produce a decimal result even
though the result wanted is a non-decimal.
3. Do you think the elimination of overloaded operators in your
favourite language would be beneficial? , why or why not?
= No, it would not be beneficial. Overloading operator would
be a helpful feature in developing a complex program with complex arithmetic
operation as well. It allows developers to create a class whose function can
replace countless lines of codes with an operator. This clearly will help a
readability and writability of a program. Eliminating overloaded operators
would null this advantage.
4. Would it be a good idea to eliminate all operator precedence
rules and require parentheses to show the desired precedence in expressions?
Why or why not?
= No. Because it will affect the readability and writability,
and maybe it can make the answer ambiguous.
5. Should C’s assigning operations (for example, +=) be
included in other languages (that do not already have them)? Why or why not?
= No. assigning operations of C should not be included in
other languages. Because the assigning operations would be the different part
of the code if it is implemented on other code that might cause confusion for
the programmer.
Monday, November 3, 2014
Assignment 6 Programming Language Concepts
Name : Alvin Theodora
NIM : 1801428434
Here is the sixth assignment of Programming Language Concepts course. The question is taken from "Concepts of Programming Language, 10th edition" from Robert W. Sebesta in chapter 6:
Review Questions
1. What is a
descriptor?
= A descriptor is the
collection of the attributes of a variable. In an implementation, a descriptor
is an area of memory that stores the attributes of a variable.
2. What are the
advantages and disadvantages of decimal data types?
= The advantage of
decimal types is being able to precisely store decimal values, at least those
within a restricted range, which cannot be done with floating-point.
The disadvantage of
decimal type is that the range of values is restricted because no exponents are
allowed, and their representation in memory is mildly wasteful.
3. What are the design
issues for character string types?
= Design issues for
character string types are
1) Should strings be
simply a special kind of character array or a primitive type?
2) Should strings have
static or dynamic length?
4. Describe the three
string length options.
= 1) Static length string : The length of
string is static and set when the string is created.
2) Limited dynamic length strings : Allow strings to have varying
length up to a declared and fixed maximum set by the variable’s definition.
Such string variables can store any number of characters between zero and the
maximum.
3) Dynamic length strings : Allow strings to have varying length with
no maximum.
5. Define ordinal,
enumeration, and subrange types.
= 1) Ordinal type is
one in which the range of possible values can be easily associated with the set
of positive integers. In Java, for example, the primitive ordinal types are
integer, char, and Boolean.
2) Enumeration is one
in which all of the possible values, which are named constants, are provided,
or enumerated, in the definition. Enumeration types provide a way of defining
and grouping collections of named constants.
3) Subrange is a
contiguous subsequence of an ordinal type. For example, 12..14 is a subrange of
integer type.
Problem Set
1. What are the
arguments for and against representing Boolean values as single bits in memory?
= A Boolean value could
be represented by a single bit. But, a single bit of memory cannot be accessed
efficiently on many machines, so they are often stored in smallest efficiently
addressable cell of memory, typically a byte.
2. How does a decimal
value waste memory space?
= Decimal types are
stored very much like character strings, using binary codes for decimal digits.
These representations are called binary coded decimal (BCD). In some cases,
they are stored one digit per byte, or two digits per byte. Either way, they
take more storage than binary representations. It takes at least four bits to
code a decimal digit. Therefore, to store a six-digit coded decimal number
requires 24 bits of memory. However, it takes only 20 bits to store the same
number in binary.
3. VAX minicomputers
use a format for floating-point numbers that is not the same as the IEEE
standard. What is this format, and why was it chosen by the designers of the
VAX computers? A reference for VAX floating –point representations is Sebesta
(1991).
= The existing DEC VAX
formats, inherited from the PDP-11, because the PDP-11 had several uniquely
innovative features, and was easier to program than its predecessors through
the additional general-purpose registers.
4. Compare the
tombstone and lock-and –key methods of avoiding dangling pointers, from the
points of view of safety and implementation cost.
= Tombstones take more
memory, while lock-and-key requires additional cpu time on each pointer
assignment to copy key as well as pointer. Pointer arithmetic could overwrite
key in the heap.
5. What disadvantages
are there in implicit dereferencing of pointers, but only in certain contexts?
For example, consider the implicit dereference of a pointer to a record in Ada
when it is used to reference a record field.
= When implicit
dereferencing of pointers occurs only in certain contexts, it makes the
language slightly less orthogonal. The context of the reference to the pointer
determines its meaning. This detracts from the readability of the language and
makes it slightly more difficult to learn.
Sunday, October 26, 2014
Assignment 5 Programming Language Concepts
Name : Alvin Theodora
NIM : 1801428434
Here is the fifth assignment of Programming Language Concepts course. The question is taken from "Concepts of Programming Language, 10th edition" from Robert W. Sebesta in chapter 5:
Review Questions
1. What are the design
issues for names?
= Case sensitivity and
the relationship of names to special words, which are either reserved words or
keywords, are the design issues for names.
2. What is the
potential danger of case-sensitive names?
= To some people, it is
a detriment to readability, because names that look similar in fact denote
different entities.
3. In what way are
reserved words better than keywords?
= From language design
aspects, reserved words are better than keywords because the ability to
redefine keywords can be confusing. For example, in Fortran could have the
following statements:
Integer Real
Real Integer
These statements
declare the program variable Real to
be Integer type and the variable Integer to be Real type.
4. What is an alias?
= Aliases are two or
more variables bound to the same storage address.
5. Which category of
C++ reference variables is always aliases?
= Union type. Union is
a type whose variables may store different type values at different times
during program execution.
Problem Set
1. Which of the
following identifier forms is most readable? Support your decision.
SumOfSales
sum_of_sales
SUMOFSALES
= sum_of_sales, because
there are underscores which separate its word, and make it easier to read.
2. Some programming
languages are typeless. What are the obvious advantages and disadvantages of
having no types in a language?
= Advantage:
1) It allows programmers to write sloppy programs
quickly.
Disadvantage:
1) You are not in control of the data and variables,
the compiler or interpreter is.
2) If you mis-assign variables, there is no way for the
compiler to catch any of your mistakes. It just “does what you said”,even if it
is wrong.
3) Supporting programs in a typeless language is much more
difficult that in a strongly types one. It is often very difficult to determine
what the original programmer wanted to do.
3. Write a simple
assignment statement with one arithmetic operator in some language you know.
For each component of the statement, list the various bindings that are
required to determine the semantics when the statement is executed. For each
binding, indicate the binding time used for the language.
=
Java
count
= count + 5;
Some
of the bindings and their binding times for the parts of this assignment
statement
are as follows:
•
The type of count is bound at compile time.
•
The set of possible values of count is bound at compiler design time.
•
The meaning of the operator symbol + is bound at compile time, when the
types
of its operands have been determined.
•
The internal representation of the literal 5 is bound at compiler design
time.
• The value of count is bound at
execution time with this statement.
4. Dynamic type binding
is closely related to implicit heap-dynamic variables. Explain this
relationship.
= Both are related to
the assignment and the statement.
5. Describe a situation
when a history-sensitive variable in a subprogram is useful.
= History sensitive
variables may be useful in data manipulation subprograms, where some operation
is performed on a variable, and the function exits, then the function is called
again. This way, the function doesn’t have to take the variable as a parameter,
but only to return it.
Monday, October 20, 2014
Assignment 4 Programming Language Concepts
Name : Alvin Theodora
= The most commonly used syntax description on syntax analyzers is context-free grammars or BNF. Using BNF, has at least three compelling advantages.
1) BNF descriptions of the syntax of programs are clear and concise, both for humans and for software systems.
2) BNF description can be used as the direct basis for the syntax analyzer.
3) Implementations based on BNF are relatively easy to maintain because of their modularity.
2. Explain the three reasons why lexical analysis is separated from syntax analysis.
= 1) Simplicity.
Techniques for lexical analysis are less complex than those required for syntax analysis, so the lexical-analysis process can be simpler if it is separate.
2) Efficiency.
Separation facilitates the optimization of lexical analyzer, because lexical analysis requires a significant portion of total compilation time.
3) Portability
Make the syntax analyzer to be platform independent from machine- dependent parts of the software system.
3. Define lexeme and token.
= ● Lexeme : Lowest level syntactic units.
● Tokens : Category of lexemes.
4. What are the primary tasks of a lexical analyzer?
= Lexical analyzers extract lexemes from a given input string and produce the corresponding tokens and then they detect syntactic errors in tokens.
5. Describe briefly the three approaches to building a lexical analyzer.
= These are three distinct approaches to construct a lexical analyzer:
1) Using a software tool to generate a table for a table-driven analyzer
2) Building such a table by hand
3) Writing code to implement a state diagram description of the tokens of the language being implemented.
1. Perform the pairwise disjointness test for the following grammar rules.
a. A → aB | b | cBB
b. B → aB | bA | aBb
c. A → aaA | b | caB
=
a. FIRST(aB) = {a}, FIRST(b) = {b}, FIRST(cBB) = {c}, Passes the test.
b. FIRST(aB) = {a}, FIRST(bA) = {b}, FIRST(aBb) = {a}, Fails the test.
c. FIRST(aaA) = {a}, FIRST(b) = {b}, FIRST(caB) = {c}, Passes the test.
2. Perform the pairwise disjointness test for the following grammar rules.
a. S → aSB | bAA
b. A → b[aB] | a
c. B → aB | a
=
a.
parse tree =
S
/ | \
a A b
/|\
a A B
|
b
Handles = b, aAB
Phrases = aaAbb, aaABb, aAb
Simple Phrase = b
b.
parse tree =
S
/ | \
b B A
/ \
a b
Handles = ab
Phrases = bBab, bBA
Simple phrase = ab
c.aaAbBb = aSBb = aSBB = x
NIM : 1801428434
Here is the fourthassignment of Programming Language Concepts course. The question is taken from "Concepts of Programming Language, 10th edition" from Robert W. Sebesta in chapter 4:
1. What are three reasons why syntax analyzers are based on grammars?
Review Questions
1. What are three reasons why syntax analyzers are based on grammars?
= The most commonly used syntax description on syntax analyzers is context-free grammars or BNF. Using BNF, has at least three compelling advantages.
1) BNF descriptions of the syntax of programs are clear and concise, both for humans and for software systems.
2) BNF description can be used as the direct basis for the syntax analyzer.
3) Implementations based on BNF are relatively easy to maintain because of their modularity.
2. Explain the three reasons why lexical analysis is separated from syntax analysis.
= 1) Simplicity.
Techniques for lexical analysis are less complex than those required for syntax analysis, so the lexical-analysis process can be simpler if it is separate.
2) Efficiency.
Separation facilitates the optimization of lexical analyzer, because lexical analysis requires a significant portion of total compilation time.
3) Portability
Make the syntax analyzer to be platform independent from machine- dependent parts of the software system.
3. Define lexeme and token.
= ● Lexeme : Lowest level syntactic units.
● Tokens : Category of lexemes.
4. What are the primary tasks of a lexical analyzer?
= Lexical analyzers extract lexemes from a given input string and produce the corresponding tokens and then they detect syntactic errors in tokens.
5. Describe briefly the three approaches to building a lexical analyzer.
= These are three distinct approaches to construct a lexical analyzer:
1) Using a software tool to generate a table for a table-driven analyzer
2) Building such a table by hand
3) Writing code to implement a state diagram description of the tokens of the language being implemented.
Problem Set
a. A → aB | b | cBB
b. B → aB | bA | aBb
c. A → aaA | b | caB
=
a. FIRST(aB) = {a}, FIRST(b) = {b}, FIRST(cBB) = {c}, Passes the test.
b. FIRST(aB) = {a}, FIRST(bA) = {b}, FIRST(aBb) = {a}, Fails the test.
c. FIRST(aaA) = {a}, FIRST(b) = {b}, FIRST(caB) = {c}, Passes the test.
2. Perform the pairwise disjointness test for the following grammar rules.
a. S → aSB | bAA
b. A → b[aB] | a
c. B → aB | a
=
a. FIRST(aSb) = {a}, FIRST(bAA) = {b}, passes the test.
b. FIRST(b{aB}) = {b}, FIRST (a) = {a}, passes the test.
c. FIRST(aB) = {a}, FIRST(a) = {a}, Fails the test.
3. Show a trace of the recursive descent parser given in Section 4.4.1 for the string a + b * c
=
a + b * c
Call lex /* returns a */
Enter <expr>
Enter <term>
Enter <factor>
Call lex /* returns + */
Exit <factor>
Exit <term>
Call lex /* returns b */
Enter <term>
Enter <factor>
Call lex /* returns * */
Exit <factor>
Call lex /* returns c */
Enter <factor>
Call lex /* returns end-of-input */
Exit <factor>
Exit <term>
Exit <expr>
4. Show a trace of the recursive descent parser given in Section 4.4.1 for the string a * (b + c)
a * (b + c)
a. FIRST(aSb) = {a}, FIRST(bAA) = {b}, passes the test.
b. FIRST(b{aB}) = {b}, FIRST (a) = {a}, passes the test.
c. FIRST(aB) = {a}, FIRST(a) = {a}, Fails the test.
3. Show a trace of the recursive descent parser given in Section 4.4.1 for the string a + b * c
=
a + b * c
Call lex /* returns a */
Enter <expr>
Enter <term>
Enter <factor>
Call lex /* returns + */
Exit <factor>
Exit <term>
Call lex /* returns b */
Enter <term>
Enter <factor>
Call lex /* returns * */
Exit <factor>
Call lex /* returns c */
Enter <factor>
Call lex /* returns end-of-input */
Exit <factor>
Exit <term>
Exit <expr>
4. Show a trace of the recursive descent parser given in Section 4.4.1 for the string a * (b + c)
a * (b + c)
=
Call lex /* returns a */
Enter <expr>
Enter <term>
Enter <factor>
Call lex /* returns * */
Exit <factor>
Call lex /* return (*/
Enter <factor>
Call lex /* returns b */
Enter <expr>
Enter <term>
Enter <factor>
Call lex /* returns + */
Exit <factor>
Exit <term>
Call lex /* returns c */
Enter <factor>
Exit <term>
Call lex / *return )*/
Exit <factor>
Exit <term>
Exit <expr>
Call lex /* returns end-of-input */
Exit <factor>
Exit <term>
Exit <expr>
5. Given the following grammar and the right sentential form, draw a parse tree and show the phrases and simple phrases, as well as the handle. S – > aAb | bBA A-> ab|aAB B->aB|b
a. aaAbb
b. bBab
c. aaAbBb
Call lex /* returns a */
Enter <expr>
Enter <term>
Enter <factor>
Call lex /* returns * */
Exit <factor>
Call lex /* return (*/
Enter <factor>
Call lex /* returns b */
Enter <expr>
Enter <term>
Enter <factor>
Call lex /* returns + */
Exit <factor>
Exit <term>
Call lex /* returns c */
Enter <factor>
Exit <term>
Call lex / *return )*/
Exit <factor>
Exit <term>
Exit <expr>
Call lex /* returns end-of-input */
Exit <factor>
Exit <term>
Exit <expr>
5. Given the following grammar and the right sentential form, draw a parse tree and show the phrases and simple phrases, as well as the handle. S – > aAb | bBA A-> ab|aAB B->aB|b
a. aaAbb
b. bBab
c. aaAbBb
=
a.
parse tree =
S
/ | \
a A b
/|\
a A B
|
b
Handles = b, aAB
Phrases = aaAbb, aaABb, aAb
Simple Phrase = b
b.
parse tree =
S
/ | \
b B A
/ \
a b
Handles = ab
Phrases = bBab, bBA
Simple phrase = ab
c.aaAbBb = aSBb = aSBB = x
Subscribe to:
Posts (Atom)
