30
SUBJECT: COMPILER CONSTRUCTION CHAPTER# 2: LEXICAL ANALYSIS 1 COURSE INSTRUCTOR AMEER JAMAL SHAH

1. It is the first phase of compiler. In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

Embed Size (px)

Citation preview

Page 1: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

SUBJECT: COMPILER CONSTRUCTION

CHAPTER# 2: LEXICAL ANALYSIS

1

COURSE INSTRUCTORAMEER JAMAL SHAH

Page 2: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

2

INTRODUCTION TO LEXICAL ANALYZER It is the first phase of compiler. In computer science, lexical analysis is the

process of converting a sequence of characters into a sequence of tokens.

A program or function which performs lexical analysis is called a lexical analyzer, lexer, or scanner.

Page 3: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

3

MAIN TASK OF A LEXICAL ANALYZER IN COMPILER DESIGN:

1. Process the input character that constitute a high level program into valid set of token.

2. It skips the comments and white spaces while creating these tokens.

3. If any erroneous input is provided by the user in the program the lexical analyzer correlate that error with source file and line number.

Page 4: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

4

INTERACTION OF THE LEXICAL ANALYZER WITH THE PARSER:

LexicalAnalyzer

ParserSource

Program

Token,tokenval

Symbol Table

Get nexttoken

error error

Page 5: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

5

TOKENS, PATTERNS, AND LEXEMES

Token: A set of input string which are related through a similar pattern. For example: any word that starts with an alphabet and can

contain any number or alphabet in between is called an identifier. identifier is called a token.

Lexeme: The actual input string which represents the token. For example: var1, var2

Pattern: Pattern are Rules which a lexical analyzer follow to create a token. For example: “letter followed by letters and digits” and “non-

empty sequence of digits”

Page 6: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

DIFF B/W TOKEN, LEXEME AND PATTERN

Token Lexeme Pattern

id y, x, sum Letter followed by letters and digits

operator + , *, - ,/ Any arithmetic operator+ or * or – or /

if if If

relation <, <=,=,,>,>= < or <= or = or > or >=

num 31 , 28 Any numeric constant

Page 7: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

7

LEXICAL ERRORS:

It is hard for a lexical analyzer to tell, without the aid of other components, that there is a source-code error.

For instance, if the string fi is encountered for the first time in C program:

fi ( a == f(x) ) .......

A lexical analyzer cannot tell whether fi is a misspelling of the keyword if or an undeclared function identifier.

Since fi is a valid lexeme for the token id, the lexical analyzer must return the token id to the parser and let some other phase of compiler, probably the parser in this case handle an error due to transposition of the letters.

Page 8: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

8

LEXICAL ANALYSIS VERSUS PARSING

There are number of reasons, why analysis portion of a compiler is normally separated into lexical analysis and parsing (syntax analysis) phases. Simplicity of design is the most important consideration. A parser that had to deal with comments and whitespace as

syntactic units would be considerably more complex than one that can assume comments and whitespace have already been removed by the lexical analyzer.

Compiler efficiency is improved. A separate lexical analyzer allows us to apply specialized

techniques that serve only lexical tasks, not the job of parsing.

Page 9: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

9

INPUT BUFFERING This section covers some efficiency issues

concerned with the buffering of input. Before discussing the problem of recognizing

lexemes in the input, let us examine some ways that are simple but important task of reading the source program can be speeded.

For instance we cannot be sure we’ve seen the end of an identifier until we see a character that is not a letter or digit.

Page 10: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

10

INPUT BUFFERING CONTINUE…

Lexical analyzer is the only phase of the compiler that reads the source program character-by-character,

It is possible to spend a considerable amount of time in the lexical analysis phase, even though the later phases are conceptually more complex.

Page 11: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

11

BUFFER PAIRS: The large numbers of characters that must be

processed during the compilation of a large source program, specialized buffering techniques have been developed to reduce the amount of overhead required to process a single input character.

An important scheme involves two buffers that are alternately reloaded.

Each buffer is of the same size N, and N is usually the size of a disk block, e.g. 1024 or 4096 bytes.

Page 12: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

12

BUFFER PAIRS: CONTINUE …

Using one system read command we can read N characters into a buffer, rather than using one system call per character.

If fewer than N characters remain in the input file, then a special character, represented by eof, marks the end of the source file.

Page 13: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

13

BUFFER PAIRS: CONTINUE …

Two pointers to the input are maintained.

1. Pointer lexemeBegin

2. Pointer forward Once the next lexeme is determined, forward is set to the

character at its right end. Then after the lexeme is recorded as an attribute value of a

token returned to the parser, lexemeBegin is set to the character immediately after the lexeme just found.

Advancing forward requires that we first test weather we have reached the end of one of the buffers and if so, we must reload the buffer from the input, and move forward to the beginning of the newly loaded buffer.

Page 14: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

14

SPECIFICATION OF TOKENS: Regular expression are an important notation for

specifying lexeme patterns. They are very effective in specifying those types of

pattern that we actually need for tokens. In this section we shall study the formal notation for

regular expressions. We shall see how these expressions are used in a

lexical analyzer generator. Next section shows how to build the lexical analyzer

by converting regular expressions to automata that perform the recognition of specified tokens.

Page 15: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

15

STRINGS AND LANGUAGES: An alphabet is any finite set of symbols. Typical examples of symbols are letters, digits, and

punctuation. A string over an alphabet is a finite sequence of

symbols drawn from that alphabet. In language theory, the terms “sentence” and “word”

are often used as synonyms for “string”. The length of a string s, usually written |s|, is the

number of occurrences of symbols in s. For example, banana is a string of length six. The empty string, denoted ϵ, is the string of length

zero.

Page 16: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

16

STRINGS AND LANGUAGES: If x and y are strings, then concatenation of x and y,

is denoted by xy. For example if x = dog and y = house, then

xy = doghouse. The empty string is the identity under concatenation;

that is, for any string s, ϵ s = s ϵ = s If we think concatenation as a product, we can

define the “exponentiation” of strings as follows: Define S0 to be ϵ; for all i>0 define si to be si-1s.

Since ϵs=s, it follows that s1=s, then s2=ss, s3=sss and so on.

Page 17: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

17

OPERATION ON LANGUAGES: In lexical analysis, the most important

operations on languages are union, concatenation, and closure.

Union is the familiar operation on sets. The concatenation of languages is all

strings formed by taking a string from the first language and a string from the second language, in all possible ways, and concatenating them.

Page 18: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

18

Operation Definition and Notation

Union of L and M

Concatenation of L and M.

LUM = {s|s is in L or s is in M}

LM = {st|s is in L and t is in M}

Page 19: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

WHAT IS REGULAR EXPRESSION?

A regular expression, often called a pattern, is an expression that specifies( کردن .a set of strings (مشخص

a regular expression provides a concise(مختصر) and flexible means to "match" (specify and recognize) String of texts.

Regular expressions consist of constants, operators and symbols that denote sets of strings and operations over these sets.

Page 20: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

20

REGULAR EXPRESSION A regular expression (RE) is defined

a Ordinary character from The empty string R|S Either R or S RS R followed by S (concatenation) R* Concatenation of R zero or more times

(R* = |R|RR|RRR...) Regular expression extensions are used as convenient notation

of complex RE: R? | R (zero or one R) R+ (one or more R) [abc] a|b|c (any of listed) [a-z] a|b|....|z (range) [^ab] c|d|... (anything but ‘a’‘b’)

Page 21: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

21

CONTINUE……..

Here are some Regular Expressions and the strings of the language denoted by the RE.RE Strings in L(R)a “a”ab “ab”a|b “a” , “b”(ab)* “” ,“ab” , “abab” ...(a|)b “ab” ,“b”

Page 22: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

22

CONTINUE……..

Here are examples of common tokens found in programming languages.digit ‘0’|’1’|’2’|’3’|’4’|’5’|’6’|’7’|’8’|’9’

integer digit digit*

identifier [a-zA-Z_][a-zA-Z0-9_]*

Page 23: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

23

RECOGNITION OF TOKENS: In the previous section we learned how to express

patterns using regular expressions. Now, we must study how to take the patterns for all the

needed tokens.

Stmt if expr then stmt

| if expr then stmt else stmt

| ϵ

expr term relop term

| term

term id

| number

Page 24: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

24

CONTINUE……. The grammer fragment in the previous Figure

describes a simple form of branching statements and conditional expressions.

This syntax is similar to that of the language Pascal, in that then appears explicitly after conditions.

For relop, we use the comparison operators like Pascal or SQL, where = is “equal” and <> is “not equals”.

The terminals of the grammar, which are if, then, else, relop, id, and number, are the names of tokens as for as the lexical analyzer is concerned.

The patterns for these tokens are described using regular expressions.

Page 25: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

25

CONTINUE……..

digit [0-9]

digits digit+

letter [A-Z a-z]

id letter(letter | digit)*

if if

then then

else else

relop < | > | <= | >= | = | <> |

Patterns for tokens

Page 26: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

26

CONTINUE…….. The lexical analyzer will recognize the keywords if,

then, and else, as well as lexemes that match the patterns for relop, id, and number.

In addition, we assign the lexical analyzer the job of stripping out whitespace, by recognizing the “token” ws defined by:

ws ( blank | tab | newline )+ Here, blank, tab, and newline are abstract symbols

that we use to express the ASCII characters of the same names.

Token ws is different from the other tokens in that, when we recognize it, we don’t return it to the parser.

Page 27: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

27

THE LEXICAL-ANALYZER GENERATOR LEX: In this section we will study a tool called

Lex, or in a more recent implementation Flex, that allows to specify a lexical analyzer by specifying regular expressions to describe patterns for tokens.

The input notation for the lex tool is referred to as the Lex language and the tool itself is the Lex compiler.

Behind the scenes, the Lex compiler transforms the input patterns into a transition diagram and generate code, in a file called lexx.yy.c, that simulates this transition diagram.

Page 28: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

28

USE OF LEX An input file, which we call lex.l is

written in the lex language and describes the lexical analyzer to be generated.

The Lex compiler transforms lex.l to a C program, in a file that is always named as lex.yy.c.

The latter file is compiled by the C compiler into a file called a.out, as always.

The C-compiler output is a working lexical analyzer that can take a stream of input characters and produce a stream of tokens.

Page 29: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

29

CONTINUE……..

Lex source program

lex.l lex.yy.c

lex.yy.c a.out

input stream sequence of tokens

Lex compiler

C Comiler

a.Out

Page 30: 1.  It is the first phase of compiler.  In computer science, lexical analysis is the process of converting a sequence of characters into a sequence

30

THE END