revisiting interpreter · recognition of tokens (lexer) checking the syntax (parser) building the...

18
Revisiting Interpreter Lecture 15 Formal Languages and Compilers 2011 Nataliia Bielova 1

Upload: others

Post on 20-Jun-2020

17 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Revisiting Interpreter

Lecture 15

Formal Languages and Compilers 2011

Nataliia Bielova

1

Page 2: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Interpreter ≠ Compiler

Formal languages and compilers 2011

2

Input

Lexer Parser tokens

Interpreter

syntax tree

Output

Compiler Executable

1 0

program var x : int; var y : int

begin x := 0; y := 3; if (x < y) then begin x := 1; y := 0 end else begin x := 0; y := 1 end ; write(x); write(y)

end

Page 3: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Front-end analysis (the same for interpreter and compiler)

Formal languages and compilers 2011

3

Recognition of tokens (lexer)

Checking the syntax (parser)

Building the syntax tree (parser)

Page 4: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

1 faze of interpreter

Syntax tree

Execution of syntax tree

Formal languages and compilers 2011

4

Page 5: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

How interpreter is made   parser.mly: definition of tokens

  lexer.mll: regular expressions and creation of tokens

  syntaxtree.ml: declarations of types for the syntax tree

  parser.mly: language grammar and creation of the syntax tree

 mail.ml: starts lexer, parser, executes syntax tree

  interpreter_base.ml: functions for the execution of the syntax tree

Formal languages and compilers 2011

5

Page 6: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Definition of the memory and environment   Formal definition:

  Updating the memory:

Formal languages and compilers 2011

6

type store = loc -> value

type env = ide -> env_entry

let updatemem((s:store), addr, (v:value)): store = function

x -> if (x = addr) then v else s(x)

Page 7: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Implementation of vectors

Formal languages and compilers 2011

7

Descr. V[0] V[1] … V[n]

Descr. V[0] V[1] V[n] …

Λ V[k] = B +O(k)

Λ V[k] =

Ins. & Del.

  scanning the whole list Ins. & Del.

Page 8: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Vectors   var V:array [LB .. UB] of type

 Address of the k-th element:

Descriptor: Representation in the memory:

Formal languages and compilers 2011

8

Λ V[k] = α + (k− LB) = (α − LB) + k = VO+ k

VO = α − LB = Λ V[0]

V[0]

V[LB]

V[LB+1]

V[UB]

VO

α

VO

LB

UB

var V : array[3..5] of int;

Λ V[4] = α + (4 − 3) = VO+ 4

VO = α − 3 = Λ V[0]

Page 9: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Bidimensional matrices

 Dimension of an element: M2

 Dimension of a row:

Formal languages and compilers 2011

9

M1 = (UB2− LB2+ 1) × M2

var V : array[LB1 ..UB1, LB2..UB2 ] of type

 Virtual Origin:

VO = α − LB1× M1− LB2× M2

Λ V[i,j] = VO + i × M1 + j × M2

Page 10: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Virtual Origin (V.O.)

Formal languages and compilers 2011

10

2 3 4 5 6

5

6

7

8

VO

α

var v : array[5..8][2..6] of int;

M2 = sizeof(int) = 1

M1 = (UB2− LB2+ 1) × M2 =

= (6 − 2 + 1) × M2 = 5

VO = α − LB1× M1− LB2× M2 =

α − 5 × M1− 2 × M2 = α − 27

Λ v[7,4] = VO + 7 × M1+ 4 × M2 =

= VO + 35 + 4

Page 11: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Virtual Origin (V.O.)

Formal languages and compilers 2011

11

0 1 2 3 4

5

6

7

8

VO

α

var v : array[5..8][2..6] of int;

M2 = sizeof(int) = 1

M1 = (UB2− LB2+ 1) × M2 =

= (6 − 2 + 1) × M2 = 5

VO = α − LB1× M1− LB2× M2 =

α − 5 × M1− 2 × M2 = α − 27

Λ v[7,4] = VO + 7 × M1+ 4 × M2 =

= VO + 35 + 4

Page 12: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Virtual Origin (V.O.)

Formal languages and compilers 2011

12

0 1 2 3 4

0

1

2

3

VO

α

var v : array[5..8][2..6] of int;

M2 = sizeof(int) = 1

M1 = (UB2− LB2+ 1) × M2 =

= (6 − 2 + 1) × M2 = 5

VO = α − LB1× M1− LB2× M2 =

α − 5 × M1− 2 × M2 = α − 27

Λ v[7,4] = VO + 7 × M1+ 4 × M2 =

= VO + 35 + 4

Page 13: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Multidimensional matrices

 Multipliers:

Formal languages and compilers 2011

13

var V : array[LB1 ..UB1, ..., LBn..UBn ] of type

array[LB1 ..UB1, LBn..UBn ] of type

array[LB1 ..UB1] of (array[LB2 ..UB2, LBn..UBn ] of type)

Mn = M

Mi = (UBi +1− LBi +1+ 1) × Mi +1 i ∈ [1,n - 1]

VO = α − LBii =1

n

∑ × Mi

Λ V[k1,...,kn ] = VO +i =1

n

∑ ki × Mi

Page 14: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Slices of array

Formal languages and compilers 2011

14

LB1

LB2

UB1

UB2

var v:array[LB1 ..UB1 ,LB2 ..UB2] of type; var s: slice[i,*] of v;

Page 15: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Slices of array

Formal languages and compilers 2011

15

LB1

LB2

UB1

UB2

i

M = M2

VOI = VOV+ i × (UB2− LB2+ 1) × M2 =

VOV+ i × M1

LB = LB2

UB = UB2

Λ I[k] = VOI+ k× M

I = V[i][*] = {V[i][LB2 ],V[i][LB2+ 1],...,V[i][UB2 ]}

Page 16: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Slices of array

Formal languages and compilers 2011

16

LB1

LB2

UB1

UB2

i

I = V[i][*] = {V[i][LB2 ],V[i][LB2+ 1],...,V[i][UB2 ]}

j

M = (UB2− LB2+ 1) × M2 = M1

VOJ = VOV+ j × M2

LB = LB1

UB = UB1

Λ J[k] = VOJ+ k× M

J = V[*][j] = {V[LB1][j],V[LB1+ 1][j],...,V[UB1][j]}

Page 17: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Notation means that

Types of passing the parameters

  P is declared as proc P(x) …

  P is invoked as call P(e)!

  α is type of passing the parameters

Formal languages and compilers 2011

17

call P(x ⇐α e)

call P(x ⇐Val e)

call P(x ⇐Ref y)

call P(x ⇐Res y)

call P(x ⇐Val- res y)

call P(x ⇐Const e)

call P(x ⇐Name e)

Note: x, y are variables, e is an arithmetical expression

Value

Reference

Result Value-result

Constant Name

Page 18: Revisiting Interpreter · Recognition of tokens (lexer) Checking the syntax (parser) Building the syntax tree (parser) 1 faze of interpreter Syntax tree Execution of syntax tree Formal

Passing by name

  create a new couple <e, r>, where r is an environment of the caller

  every time when x should be evaluated, e is getting evaluated instead in the environment r and put instead of x.

  x cannot be assigned values in P!

Formal languages and compilers 2011

18

call P(x ⇐Name e)