Extended edition

Torben Ægidius Mogensen

DEPARTMENT OF COMPUTER SCIENCE UNIVERSITY OF COPENHAGEN

Published through c

lulu.com.

2000 2008

Torben Ægidius Mogensen

torbenm@diku.dk

Department of Computer Science University of Copenhagen Universitetsparken 1 DK-2100 Copenhagen DENMARK

Book homepage:

http://www.diku.dk/∼torbenm/Basics

First published 2000 This edition: July 25, 2008

Contents

1 Introduction

1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 What is a compiler? Interpreters . . . . . . . . . . . . . . . . . . . . . The phases of a compiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Why learn about compilers? . . . . . . . . . . . . . . . . . The structure of this book . . . . . . . . . . . . . . . . . . To the lecturer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Acknowledgements

1

1 2 3 4 5 6 7 8

Permission to use . . . . . . . . . . . . . . . . . . . . . . .

2 Lexical Analysis

2.1 2.2 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . Regular expressions . . . . . . . . . . . . . . . . . . . . . . 2.2.1 2.2.2 2.3 2.4 2.5 2.6 Shorthands Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9

9 10 13 14 16 19 19 21 23 24 27 30 31 33 35 37 42 44 44

Nondeterministic nite automata . . . . . . . . . . . . . . Converting a regular expression to an NFA . . . . . . . . . 2.4.1 Optimisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Deterministic nite automata 2.6.1 2.6.2

Converting an NFA to a DFA . . . . . . . . . . . . . . . . Solving set equations . . . . . . . . . . . . . . . . . The subset construction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.7 2.8

Size versus speed 2.8.1 2.8.2

Minimisation of DFAs

Example . . . . . . . . . . . . . . . . . . . . . . . . Dead states . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lexer generators . . . . . . . . . . . . . . . . . . .

2.9

Lexers and lexer generators 2.9.1

2.10 Properties of regular languages 2.10.1 Relative expressive power

i

ii

CONTENTS

2.10.2 Limits to expressive power . . . . . . . . . . . . . . 2.10.3 Closure properties . . . . . . . . . . . . . . . . . . 46 47 48 48

2.11 Further reading . . . . . . . . . . . . . . . . . . . . . . . . Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 Syntax Analysis

3.1 3.2 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . Context-free grammars . . . . . . . . . . . . . . . . . . . . 3.2.1 3.3 How to write context free grammars . . . . . . . .

55

55 56 58 60 61 65 67 70 71 72 73 76 77 80 81 82 83 85 85 87 88 89 91 97 97

Derivation . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1 Syntax trees and ambiguity . . . . . . . . . . . . .

3.4

Operator precedence 3.4.1

. . . . . . . . . . . . . . . . . . . . .

Rewriting ambiguous expression grammars . . . . . . . . . . . . . . . . . . . . . .

3.5 3.6 3.7 3.8 3.9 3.10

Other sources of ambiguity

Syntax analysis . . . . . . . . . . . . . . . . . . . . . . . . Predictive parsing . . . . . . . . . . . . . . . . . . . . . . .

Nullable

and

FIRST

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Predictive parsing revisited

FOLLOW

. . . . . . . . . . . . . . . . . . . . . . . . . . .

3.11 LL(1) parsing . . . . . . . . . . . . . . . . . . . . . . . . . 3.11.1 Recursive descent . . . . . . . . . . . . . . . . . . . 3.11.2 Table-driven LL(1) parsing . . . . . . . . . . . . .

3.11.3 Conicts . . . . . . . . . . . . . . . . . . . . . . . . 3.12 Rewriting a grammar for LL(1) parsing 3.12.1 Eliminating left-recursion . . . . ....