lecture 25 programming languages and programs
play

Lecture #25: Programming Languages and Programs Metalinguistic - PDF document

Lecture #25: Programming Languages and Programs Metalinguistic Abstraction A programming language, is a notation for describing computations Weve created abstractions of actionsfunctionsand of things or processes. classes.


  1. Lecture #25: Programming Languages and Programs Metalinguistic Abstraction • A programming language, is a notation for describing computations • We’ve created abstractions of actions—functions—and of things— or processes. classes. • These range from low-level notations, such as machine language or • Metalinguistic abstraction refers to the creation of languages— simple hardware description languages, where the subject matter is abstracting description. Programming languages are one example. typically finite bit sequences and primitive operations on them that • Programming languages are effective: they can be implemented. correspond directly to machine instructions or gates, . . . • These implementations interpret utterances in that language, per- • . . . To high-level notations, such as Python, in which the subject mat- forming the described computation or controlling the described pro- ter can be objects and operations of arbitrary complexity. cess. • The universe of implementations of these languages is layered: Python • The interpreter may be hardware (interpreting machine-language can be implemented in C, which in turn can be implemented in assem- programs) or software (a program called an interpreter ), or (in- bly language, which in turn is implemented in machine language, which creasingly common) both. in turn is implemented with gates, which in turn are implemented • To be implemented, though, the grammar and meaning of utterances with transistors. in the programming language must be defined precisely. Last modified: Mon Mar 28 15:27:51 2016 CS61A: Lecture #25 1 Last modified: Mon Mar 28 15:27:51 2016 CS61A: Lecture #25 2 A Sample Language: Calculator Syntax and Semantics of Calculator • Source: John Denero. Expression types: • Prefix notation expression language for basic arithmetic Python-like • A call expression is an operator name followed by a comma-separated syntax, with more flexible built-in functions. list of operand expressions, in parentheses • A primitive expression is a number calc> add(1, 2, 3, 4) 10 Operators: calc> mul() • The add (or + operator returns the sum of its arguments 1 calc> sub(100, mul(7, add(8, div(-12, -3)))) • The sub (-) operator returns either 16.0 – the additive inverse of a single argument, or calc> -(100, *(7, +(8, /(-12, -3)))) – the sum of subsequent arguments subtracted from the first. 16.0 • The mul (*) operator returns the product of its arguments. • The div (/) operator returns the real-valued quotient of a dividend and divisor. Last modified: Mon Mar 28 15:27:51 2016 CS61A: Lecture #25 3 Last modified: Mon Mar 28 15:27:51 2016 CS61A: Lecture #25 4 Expression Trees (again) Expression Trees By Hand • Our calculator program represents expressions as trees (see Lec- As usual, we have defined (in lect25.py ) the methods __repr__ and ture #12). __str__ to produce reasonable representations of expression trees: • It consists of a parser , which produces expression trees from in- >>> Exp(’add’, [1, 2]) put text, and an evaluator , which performs the computations repre- Exp(’add’, [1, 2]) sented by the trees. >>> str(Exp(’add’, [1, 2])) ’add(1, 2)’ • You can use the term “interpreter” to refer to both, or to just the >>> Exp(’add’, [1, Exp(’mul’, [2, 3, 4])]) evaluator. Exp(’add’, [1, Exp(’mul’, [2, 3, 4])]) • To create an expression tree: >>> str(Exp(’add’, [1, Exp(’mul’, [2, 3, 4])])) class Exp(object): ’add(1, mul(2, 3, 4))’ """A call expression in Calculator.""" def __init__(self, operator, operands): self.operator = operator self.operands = operands Last modified: Mon Mar 28 15:27:51 2016 CS61A: Lecture #25 5 Last modified: Mon Mar 28 15:27:51 2016 CS61A: Lecture #25 6

  2. Evaluation Applying Operators Evaluation discovers the form of an expression and then executes a Calculator has a fixed set of operators that we can enumerate corresponding evaluation rule. def calc_apply(operator, args): • Primitive expressions (literals) “evaluate to themselves” """Apply the named operator to a list of args. if operator in (’add’, ’+’): • Call expressions are evaluated recursively, following the tree struc- return sum(args) ture: if operator in (’sub’, ’-’): – Evaluate each operand expression, collecting values as a list of if len(args) == 0: arguments. raise TypeError(operator + ’requires at least 1 argument’) – Apply the named operator to the argument list. if len(args) == 1: return -args[0] def calc_eval(exp): return sum(args[:1] + [-arg for arg in args[1:]]) """Evaluate a Calculator expression.""" etc. if type(exp) in (int, float): return exp elif type(exp) == Exp: arguments = list(map(calc_eval, exp.operands)) return calc_apply(exp.operator, arguments) Last modified: Mon Mar 28 15:27:51 2016 CS61A: Lecture #25 7 Last modified: Mon Mar 28 15:27:51 2016 CS61A: Lecture #25 8 Read-Eval-Print Loop Calculator Example: Parsing The user interface to many programming languages is an interactive Recap: The strategy. loop that • Parsing: Convert text into expression trees. • Reads an expression from the user • Evaluation: Recursively traverse the expression trees calculating a • Parses the input to build an expression tree result • Evaluates the expression tree ’add(2, 2)’ Exp(’add’, (2, 2)) 4 ⇒ ⇒ = = • Prints the resulting value of the expression def read_eval_print_loop(): """Run a read-eval-print loop for calculator.""" while True: try: expression_tree = calc_parse(input(’calc> ’)) print(calc_eval(expression_tree)) except: print error message and recover Last modified: Mon Mar 28 15:27:51 2016 CS61A: Lecture #25 9 Last modified: Mon Mar 28 15:27:51 2016 CS61A: Lecture #25 10 Parsing: Lexical and Syntactic Analysis Tokens • To parse a text is to analyze it into its constituents and to describe • Purpose of tokenize is to perform a transformation like this: their relationship or structure. >>> tokenize(’add(2, mul(4, 6))’) • Thus, we can parse an English sentence into nouns, verbs, adjectives, [’add’, ’(’, ’2’, ’,’, ’mul’, ’(’, ’4’, ’,’, ’6’, ’)’, ’)’] etc., and determine what plays the role of subject, what is plays the • In principle, we could dispense with this step and go from text to role of object of the action, and what clauses or words modify what. trees directly, but • When processing programming languages, we typically divide task • We choose these particular chunks because they correspond to how into two stages: we think about and describe the text, and thus make analysis sim- – Lexical analysis (aka tokenization): Divide input string into mean- pler: ingful tokens , such as integer literals, identifiers, punctuation – We say “the word ‘add’ ”, not “the character ‘a’ followed by the marks. character ‘b’. . . ” – Syntactic analysis: Convert token sequence into trees that re- – We don’t mention spaces at all. flect their meaning. • In production compilers, the lexical analyzer typically returns more def calc_parse(line): # From lect24.py information, but the simple tokens will do for this problem. """Parse a line of calculator input and return an expression tree.""" tokens = tokenize(line) expression_tree = analyze(tokens) return expression_tree Last modified: Mon Mar 28 15:27:51 2016 CS61A: Lecture #25 11 Last modified: Mon Mar 28 15:27:51 2016 CS61A: Lecture #25 12

Recommend


More recommend