jgs
Compilers
Lecture 14:
Parser
Dr. Javier Gonzalez-Sanchez
[email protected]
Slide 2
Slide 2 text
jgs
Previously …
Slide 3
Slide 3 text
Dr. Javier Gonzalez-Sanchez | Compilers | 3
jgs
Question
{"name":false}
Slide 4
Slide 4 text
Dr. Javier Gonzalez-Sanchez | Compilers | 4
jgs
Question
{"name":false,
"age" :100
}
Slide 5
Slide 5 text
Dr. Javier Gonzalez-Sanchez | Compilers | 5
jgs
Question
{"name":false,
"age" :100,
"grades”:[1,2,3]
}
Slide 6
Slide 6 text
Dr. Javier Gonzalez-Sanchez | Compilers | 6
jgs
Question
{"name":false,
"age" :100,
"grades":{
"labs":[1,2,3]
}
}
Slide 7
Slide 7 text
Dr. Javier Gonzalez-Sanchez | Compilers | 7
jgs
Let’s Work
Slide 8
Slide 8 text
Dr. Javier Gonzalez-Sanchez | Compilers | 8
jgs
Rules
PROGRAM
BODY
C
EXPRESSION
X
Y
R
E
A
B
{
0;
1 + 2;
3 * (4 + hello);
}
Slide 9
Slide 9 text
Dr. Javier Gonzalez-Sanchez | Compilers | 9
jgs
Rules
PROGRAM
BODY
C
A
B
{
0;
1 + 2;
3 * (4 + hello);
}
EXPRESSION
X
Y
R
E
Slide 10
Slide 10 text
Dr. Javier Gonzalez-Sanchez | Compilers | 10
jgs
Let’s Work
Slide 11
Slide 11 text
jgs
Parser
Slide 12
Slide 12 text
Dr. Javier Gonzalez-Sanchez | Compilers | 12
jgs
Parser
BNF
EBNF
A
|
AA
&
B
!
Parser
Grammar
Slide 13
Slide 13 text
Dr. Javier Gonzalez-Sanchez | Compilers | 13
jgs
PREDICTIVE
DESCENDENT
RECURSIVE
PARSER
Slide 14
Slide 14 text
Dr. Javier Gonzalez-Sanchez | Compilers | 14
jgs
Parser | Step by Step
For each rule in the grammar {
▪ Step 1. The left-hand side (method declaration)
▪ Step 2. The right-hand side (body of the method) as follows:
▪ Step 2.1 Non-terminals (boxes) will be a call to a method
▪ Step 2.2. Terminals (ovals) will be if-conditions
▪ Step 2.3. Lines in a loop (EBNF items) will be loops
}
Slide 15
Slide 15 text
Dr. Javier Gonzalez-Sanchez | Compilers | 15
jgs
Parser
public class Parser {
private static Vector tokens;
private static int currentToken;
public static void RULE_PROGRAM () {}
public static void RULE_BODY () {}
public static void RULE_EXPRESSION () {}
public static void RULE_X () {}
public static void RULE_Y () {}
public static void RULE_R () {}
public static void RULE_E () {}
public static void RULE_A () {}
public static void RULE_B () {}
public static void RULE_C () {}
Slide 16
Slide 16 text
Dr. Javier Gonzalez-Sanchez | Compilers | 16
jgs
Parser
public static void RULE_PROGRAM() {
if (tokens.get(currentToken).getWord().equals(“{”)) {
currentToken++;
else
error(1);
RULE_BODY();
if (tokens.get(currentToken).getWord().equals(“}”))
currentToken++;
else
error(2);
}
PROGRAM
Slide 17
Slide 17 text
Dr. Javier Gonzalez-Sanchez | Compilers | 17
jgs
Parser
public static void RULE_BODY() {
while (!tokens.get(currentToken).getWord().equals(“}”)) {
RULE_EXPRESSION();
if (tokens.get(currentToken).getWord().equals(“;”))
currentToken++;
else
error(3);
}
}
BODY
Slide 18
Slide 18 text
Dr. Javier Gonzalez-Sanchez | Compilers | 18
jgs
Parser
public static void RULE_EXPRESSION() {
RULE_X();
while (tokens.get(currentToken).getWord().equals(“|”)) {
currentToken++;
RULE_X();
}
}
EXPRESSION
Slide 19
Slide 19 text
Dr. Javier Gonzalez-Sanchez | Compilers | 19
jgs
Parser
public static void RULE_X() {
RULE_Y();
while (tokens.get(currentToken).getWord().equals(“&”)) {
currentToken++;
RULE_Y();
}
}
X
Slide 20
Slide 20 text
Dr. Javier Gonzalez-Sanchez | Compilers | 20
jgs
Parser
public static void RULE_Y() {
if (tokens.get(currentToken).getWord().equals(“!”)) {
currentToken++;
}
RULE_R();
}
Y
Slide 21
Slide 21 text
Dr. Javier Gonzalez-Sanchez | Compilers | 21
jgs
Parser
public static void RULE_R() {
RULE_E();
while ( tokens.get(currentToken).getWord().equals(“<”)
|tokens.get(currentToken).getWord().equals(“>”)
|tokens.get(currentToken).getWord().equals(“==”)
|tokens.get(currentToken).getWord().equals(“!=”)
) {
currentToken++;
RULE_E();
}
}
R
Slide 22
Slide 22 text
Dr. Javier Gonzalez-Sanchez | Compilers | 22
jgs
Parser
public static void RULE_E() {
RULE_A();
while (tokens.get(currentToken).getWord().equals(“-”)
| tokens.get(currentToken).getWord().equals(“+”)
) {
currentToken++;
RULE_A();
}
}
E
Slide 23
Slide 23 text
Dr. Javier Gonzalez-Sanchez | Compilers | 23
jgs
Parser
public static void RULE_A() {
RULE_B();
while (tokens.get(currentToken).getWord().equals(“/”)
| tokens.get(currentToken).getWord().equals(“*”)
) {
currentToken++;
RULE_B();
}
}
A
Slide 24
Slide 24 text
Dr. Javier Gonzalez-Sanchez | Compilers | 24
jgs
Parser
public static void RULE_B() {
if (tokens.get(currentToken).getWord().equals(“-”)) {
currentToken++;
}
RULE_C();
}
B
Slide 25
Slide 25 text
Dr. Javier Gonzalez-Sanchez | Compilers | 25
jgs
Parser
public static void RULE_C() {
if (tokens.get(currentToken).getToken().equals(“integer”)) {
currentToken++;
} else if (tokens.get(currentToken).getToken().equals(“identifier”)) {
currentToken++;
} else if (tokens.get(currentToken).getWord().equals(“(”)) {
currentToken++;
RULE_EXPRESSION();
if (tokens.get(currentToken).getWord().equals(“)”)) {
currentToken++;
} else error(4);
}
} else { error (5); }
}
C
Slide 26
Slide 26 text
Dr. Javier Gonzalez-Sanchez | Compilers | 26
jgs
Homework
Slide 27
Slide 27 text
Dr. Javier Gonzalez-Sanchez | Compilers | 27
jgs
Questions
Slide 28
Slide 28 text
jgs
Compilers
Javier Gonzalez-Sanchez, Ph.D.
[email protected]
Spring 2025
Copyright. These slides can only be used as study material for the Compilers course at Universidad Panamericana.
They cannot be distributed or used for another purpose.
Slide 29
Slide 29 text
jgs
Compilers
Javier Gonzalez-Sanchez, Ph.D.
[email protected]
Spring 2025
Copyright. These slides can only be used as study material for the Compilers course at Universidad Panamericana.
They cannot be distributed or used for another purpose.