Syntax Analysis The Role of the Parser In














- Slides: 14

Syntax Analysis

The Role of the Parser In our compiler model, the parser obtains a string of tokens from the lexical analyzer, as shown in figure below , and verifies that the string can be generated by the grammar for the source program. We expect the parser to report any syntax errors in an intelligible fashion. It should also recover from commonly occurring errors so that it can continue processing the remainder of its input.

The Role of the Parser By design, every programming language has precise rules that prescribe the syntactic structure of well-formed programs. In C, for example, a program is made up of functions, a function out of declarations and statements, a statement out of expressions, an expression out of tokens and so on. The syntax of programming language constructs can be specified by context-free grammars or BNF (Backus-Naur Form) notation. Grammars offer significant benefits for both language designers and compiler writers

Syntax Analysis Also called parsing, The parser has two functions: • It checks that the tokens appearing in its input, which is the output of the lexical analyzer, occur in patterns that are permitted by the specification for the source language. • It also imposes on the tokens a tree-like structure that is used by the subsequent phases of the compiler. • Note : The tree shows the order in which the operations are to be performed

Context-Free Grammars (CFG) • A grammar is a set of rules for putting strings together and so corresponds to a language. • Many programming language constructs have an inherently recursive structure that can be defined by context-free grammars. For example, we might have a conditional statement defined by a rule such as • If S 1 and S 2 are statements and E is an expression, then "If E then S 1 else S 2" is a statement. This form of conditional statement cannot be specified using the notation regular expressions. • Such as a role is called syntactic variables, stmt to denote the class of statements and expr the class of expressions.

Context-Free Grammars (CFG) A context free grammar (CFG for short) consists of terminals, nonterminals, a start symbol, and productions. For example: stmt if ( expr ) stmt else stmt • Terminals: Terminals are the basic symbols from which strings are formed. The word "token" is a synonym for "terminal" when we are talking about grammars for programming languages. hey are said to be terminal, because they cannot be substituted by any other symbols. The substitution process stops with terminal symbols. • E. g. : if, else, “(“ and “)” • Non-terminals: Nonterminal are syntactic variables that denote sets of strings and can be substituted. • E. g. : stmt, expr

Context-Free Grammars (CFG) A context free grammar (CFG for short) consists of terminals, nonterminals, a start symbol, and productions. For example: stmt if ( expr ) stmt else stmt • Terminals: Terminals are the basic symbols from which strings are formed. The word "token" is a synonym for "terminal" when we are talking about grammars for programming languages. hey are said to be terminal, because they cannot be substituted by any other symbols. The substitution process stops with terminal symbols. • E. g. : if, else, “(“ and “)” • Non-terminals: Nonterminal are syntactic variables that denote sets of strings and can be substituted. • E. g. : stmt, expr

Context-Free Grammars (CFG) • A start symbol: One nonterminal is distinguished as the Start Symbol. E. g. : stmt • Productions: The set of Productions where each production consists of a nonterminal, called the left side followed by an arrow, followed by a string of nonterminals and/or terminals called the right side. • A non-terminal called the head or left side • Followed by arrow the symbol or : : = • Followed by string of non-terminals &|or terminals called a body or right side E. g. : stmt if ( expr ) stmt else stmt

Example: The grammar with the following productions defines simple arithmetic expressions. In this grammar, the terminal symbols are id + - * / ↑ ( ) The nonterminal symbols are expr and op, and expr is the start symbol.

The previous grammar can be rewriting by using shorthand's as: where E and A are nonterminal, with E the start symbol. The remaining symbols are terminals

Derivations and Parse Trees How does a context-free grammar define a language? The central idea is that productions may be applied repeatedly to expand the nonterminal in a string of nonterminal and terminals. For example, consider the following grammar for arithmetic expressions The nonterminal E is an abbreviation for expression. The production We call such a sequence of replacements a derivation of - (id) from E. This derivation provides a proof that one particular instance of an expression is the string - (id). -(id + id)

Parse Tree • may be viewed as a graphical representation for derivations that filters out the choice regarding replacement order. Each interior node of the parse tree is labeled by some nonterminal A, and the children of the node are labeled, from left to right, by the symbols in the right side of the production by which this A was replaced in the derivaton. The leaves of the parse tree are labeled by nonterminals or terminals and, read from left to right. For example, the parse tree for -(id+id) that implied by the derivation of previous example.


Example Two parse trees for id + id * id