Slide 1

Slide 1 text

jgs Compilers Lecture 14: Parser Implementation Dr. Javier Gonzalez-Sanchez [email protected]

Slide 2

Slide 2 text

Dr. Javier Gonzalez-Sanchez | Compilers | 2 jgs PREDICTIVE DESCENDENT RECURSIVE PARSER

Slide 3

Slide 3 text

Dr. Javier Gonzalez-Sanchez | Compilers | 3 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 4

Slide 4 text

Dr. Javier Gonzalez-Sanchez | Compilers | 4 jgs Rules { 0; 1 + 2; 3 * (4 + hello); }

Slide 5

Slide 5 text

jgs Next Step

Slide 6

Slide 6 text

Dr. Javier Gonzalez-Sanchez | Compilers | 6 jgs Homework Teams of Three Members

Slide 7

Slide 7 text

Dr. Javier Gonzalez-Sanchez | Compilers | 7 jgs Homework Programming Assignment 2 Develop a Predictive Descendent Recursive Parser by coding a Grammar

Slide 8

Slide 8 text

Dr. Javier Gonzalez-Sanchez | Compilers | 8 jgs Question

Slide 9

Slide 9 text

Dr. Javier Gonzalez-Sanchez | Compilers | 9 jgs GitHub Classroom https://classroom.github.com/a/--tRWhKA

Slide 10

Slide 10 text

jgs Code

Slide 11

Slide 11 text

Dr. Javier Gonzalez-Sanchez | Compilers | 11 jgs Homework You Need a Lexer

Slide 12

Slide 12 text

Dr. Javier Gonzalez-Sanchez | Compilers | 12 jgs You Need a Lexer Add Yours To the Repository (I recommend creating a package 'Lexer'

Slide 13

Slide 13 text

Dr. Javier Gonzalez-Sanchez | Compilers | 13 jgs Another Option (Just In Case)

Slide 14

Slide 14 text

Dr. Javier Gonzalez-Sanchez | Compilers | 14 jgs Class Token

Slide 15

Slide 15 text

Dr. Javier Gonzalez-Sanchez | Compilers | 15 jgs Class Automata

Slide 16

Slide 16 text

Dr. Javier Gonzalez-Sanchez | Compilers | 16 jgs Class Lexer

Slide 17

Slide 17 text

Dr. Javier Gonzalez-Sanchez | Compilers | 17 jgs Class Main

Slide 18

Slide 18 text

Dr. Javier Gonzalez-Sanchez | Compilers | 18 jgs Class Main

Slide 19

Slide 19 text

Dr. Javier Gonzalez-Sanchez | Compilers | 19 jgs Class Parser

Slide 20

Slide 20 text

jgs Example

Slide 21

Slide 21 text

Dr. Javier Gonzalez-Sanchez | Compilers | 21 jgs Grammar

Slide 22

Slide 22 text

Dr. Javier Gonzalez-Sanchez | Compilers | 22 jgs Input

Slide 23

Slide 23 text

Dr. Javier Gonzalez-Sanchez | Compilers | 23 jgs Input → Lexer

Slide 24

Slide 24 text

Dr. Javier Gonzalez-Sanchez | Compilers | 24 jgs Input → Lexer → Parser

Slide 25

Slide 25 text

jgs Next

Slide 26

Slide 26 text

Dr. Javier Gonzalez-Sanchez | Compilers | 26 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 27

Slide 27 text

Dr. Javier Gonzalez-Sanchez | Compilers | 27 jgs Assignment 2 | Code PROGRAM

Slide 28

Slide 28 text

Dr. Javier Gonzalez-Sanchez | Compilers | 28 jgs Assignment 2 | Code METHODS

Slide 29

Slide 29 text

Dr. Javier Gonzalez-Sanchez | Compilers | 29 jgs Assignment 2 | Code BODY

Slide 30

Slide 30 text

Dr. Javier Gonzalez-Sanchez | Compilers | 30 jgs Assignment 2 | Code PARAMS

Slide 31

Slide 31 text

Dr. Javier Gonzalez-Sanchez | Compilers | 31 jgs Assignment 2 | Code public static void RULE_ASSIGNMENT() { } ASSIGNMENT

Slide 32

Slide 32 text

Dr. Javier Gonzalez-Sanchez | Compilers | 32 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 33

Slide 33 text

Dr. Javier Gonzalez-Sanchez | Compilers | 33 jgs Parser public static void RULE_EXPRESSION() { RULE_X(); while (tokens.get(currentToken).getWord().equals(“|”)) { currentToken++; RULE_X(); } } EXPRESSION

Slide 34

Slide 34 text

Dr. Javier Gonzalez-Sanchez | Compilers | 34 jgs Parser public static void RULE_X() { RULE_Y(); while (tokens.get(currentToken).getWord().equals(“&”)) { currentToken++; RULE_Y(); } } X

Slide 35

Slide 35 text

Dr. Javier Gonzalez-Sanchez | Compilers | 35 jgs Parser public static void RULE_Y() { if (tokens.get(currentToken).getWord().equals(“!”)) { currentToken++; } RULE_R(); } Y

Slide 36

Slide 36 text

Dr. Javier Gonzalez-Sanchez | Compilers | 36 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 37

Slide 37 text

Dr. Javier Gonzalez-Sanchez | Compilers | 37 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 38

Slide 38 text

Dr. Javier Gonzalez-Sanchez | Compilers | 38 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 39

Slide 39 text

Dr. Javier Gonzalez-Sanchez | Compilers | 39 jgs Parser public static void RULE_B() { if (tokens.get(currentToken).getWord().equals(“-”)) { currentToken++; } RULE_C(); } B

Slide 40

Slide 40 text

Dr. Javier Gonzalez-Sanchez | Compilers | 40 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 41

Slide 41 text

Dr. Javier Gonzalez-Sanchez | Compilers | 41 jgs Assignment 2 | Code public static void RULE_C() { } C

Slide 42

Slide 42 text

Dr. Javier Gonzalez-Sanchez | Compilers | 42 jgs Assignment 2 | Code public static void RULE_VARIABLE() { } VARIABLE

Slide 43

Slide 43 text

Dr. Javier Gonzalez-Sanchez | Compilers | 43 jgs Assignment 2 | Code public static void RULE_WHILE() { } WHILE

Slide 44

Slide 44 text

Dr. Javier Gonzalez-Sanchez | Compilers | 44 jgs Assignment 2 | Code public static void RULE_IF() { } IF

Slide 45

Slide 45 text

Dr. Javier Gonzalez-Sanchez | Compilers | 45 jgs Assignment 2 | Code public static void RULE_RETURN() { } RETURN

Slide 46

Slide 46 text

Dr. Javier Gonzalez-Sanchez | Compilers | 46 jgs Assignment 2 | Code public static void RULE_CALL_METHOD () { } CALL_METHOD

Slide 47

Slide 47 text

Dr. Javier Gonzalez-Sanchez | Compilers | 47 jgs Assignment 2 | Code public static void RULE_PARAM_VALUES () { } PARAM_VALUES

Slide 48

Slide 48 text

Dr. Javier Gonzalez-Sanchez | Compilers | 48 jgs Homework The first version of your parser (without error handling) is due in one week. Focus on implementing the grammar rules and parsing functionality. Assume the input is always correct; if an error occurs, the parser may stop.

Slide 49

Slide 49 text

Dr. Javier Gonzalez-Sanchez | Compilers | 49 jgs Questions

Slide 50

Slide 50 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.