Python

profileAlto_90
h.w2.pdf

1

The George Washington University School of Engineering and Applied Science

Department of Computer Science CSci 4223 – Principles of Programming Languages – Spring 2016

Programming Assignment #2: A Simple lexical analyzer Due Date: March 6, 2016 -- Midnight

Instructor: A. Bellaachia

The following represents the EBNF grammar for a very simple language, called C--:

program ----> {stmt} stmt ----> var_dec ";" | assign ";" | read_stat ";" | write_stat ";" | if_stmt ";" | while_stmt ";" var_dec ----> type var assign ----> var "=" expr expr ----> add_expr add_expr ----> mul_expr {("+"|"-") mul_expr} mul_expr ----> simple_expr {("*"|"/"|"%") simple_expr } simple_expr ----> id | var | "(" expr ")" read_stat ----> "READ" "(" expr ")" write_stat ----> "PRINT" "(" expr ")" type ----> "int" | "float" | "boolean" id ----> intnumber | floatnumber

intnumber ----> Digit | Digit intnumber floatnumber: ----> intnumber "." intnumber

Digit ----> [0-9]+ boolean ----> "0" | "1"; var ----> [A-Z, a-z]+ block ----> program [ block ] if_stmt ----> "if" bool_stmt ":" [block] [ "else:" [block] ] "end if" while_stmt ----> "while" bool_stmt "do" [block] "end while" bool_stmt ----> and_stmt | rel_stmt |boolean and_stmt ----> bool_stmt {("and"|"or") bool_stmt} rel_stmt ----> simple_expr (">"|"<"|">="|"==") simple_expr

x Please note the following about C--: o C-- variables are not case sensitive: Var and var refer to the same variable.

All variables are declared at the beginning of your program.

2

x Sample input data:

{ Int x ; Int y ; Int z ; X = 10 ; Y = 20 ; print (x); print (x+y); read(z) z = z + x + y; print (z);

} {

if 5 > 1: {

if (4>3) and (2 <5) : {

print 1; print 2;

} else:

{ print 3; print (3+1)

} end if;

} end if;

}

In this first project, we would like to develop a lexical analyzer for C—using Python. The lexical analyzer (sometimes referred as or recognizer or simply as tokenizer) reads a string of characters and checks if a valid token in the grammar. Lexical Analysis terminology:

- Token: o Terminal symbol in a grammar o Classes of sequences of characters with a collective meaning, e.g., IDENT o Constants, Operators, Punctuation, Reserved words (keywords)

3

- Lexeme : o character sequence matched by an instance of the token, e.g. “sqrt”

Given the following expression: total = subtotal1 * 12;

- Lexical Analyzer step 1: group a stream of characters into lexemes:

t o t a l = s u b T o t a l 1 * 1 2 ;

- Lexical Analyzer step 2: Convert lexemes into tokens

The lexical analyzer should return the following:

Token (Also known as Lexeme) Token Type Total VAR_CODE (identifier) = ASSIGN_OP Subtotal1 VAR_CODE * MULTIPLY_OP 12 DIGIT_CODE (integer literal) ; SEMICOLON

□ Your lexical analyzer should include the following:

x Extract tokens from a given input string and generate the type of the token.

x Skip comments and blanks x You may need a lookup table that stores all the reserved

words of your grammar. This will be used to check whether a token is a reserved word.

x Insert user-defined tokens into a symbol table, which will be used by other components.

x Detect syntactic errors in tokens and report such errors. x Your lexical analyzer will always put the code of the next

token in a variable called nextToken. For example, if the token is an integer, nextToken will be equal to DIGIT_CODE.

Develop you lexical analyzer is Python

total = subtotal1 * 12 ;