Lecture: 2 Prepared by: Nitin Bansal Roll No: 03CS3015 Introduction to Compilers (cont..) Lexical Analyzer: Compilers maintain a symbol table i.e. it keeps track of variables, labels etc. depending on the design. For example: an expression of the form : Position =Initial +60*Rate gets converted to id1 = id2 +60*id3 SYMBOL TABLE: Position id1 & attributes Initial id2 & attributes Rate id3 & attributes So the lexical analyzer converts symbols to an array of easy to use symbolic constants (TOKENS). Also, it removes spaces and other unnecessary things like comments etc. Syntax Analyzer: It checks the code syntax using CFG : i.e. the set of rules For example: if we have grammar of the form 1. EE=E 2. EE+E 3. EE*E 4. Econst Then corresponding parse tree derivation is: EE=Eid=E+Eid=id+E*Eid=id+id*60 Parser thus consumes these tokens .If any token is left unconsumed, the parser gives an error /warning. Semantic Analyzer: In this checks are performed to ensure that the components of a program fit together meaningfully. For example: we have a sample code: int a; int b; char c[]; a=b+c; (Type check is done) Now the SYNTHESIS starts: 1 Lecture:2 Intermediate Code Generation: We can think of this intermediate representation as a program for an abstract machine. For the example used in lexical analysis the intermediate representation will be: temp1=initoreal(60) temp2= id3*temp1 temp3=id2+temp2 id1=temp3 Code Optimization: This phase attempts to improve the intermediate code, so that faster running machine code will result .Some optimization are trivial. So the final code for example above will be temp1=id3*60 // removed unnecessary variables id1=id2+temp1 Target Code Generation: Machine (M/C) Specific Compilers may generate many types of target codes depending on M/C while some compilers make target code only for a specific M/C. It is normally the generation of relocatable machine code or assembly code. RELATED COMPILER FIELDS Macro Processor: A Processor may allow a user to define macros that are shorthand for longer constructs. It is quite similar to “Inline Functions” but there are few differences. Like Macros is processed before compilation whereas Inline Function is processed during compilation. For example: we have An Inline Function: Fmax(a, b) {a>b? a: b;} Macro defined as: # Mmax(a, b) (a>b? a: b) And main function: main () {a=1; b=3; Fmax(++a, ++b) // this calls the inline function with incremented //values of a and b during compilation Whereas instead of this if we have a call like Mmax(++a, ++b) // this leads to two increments in value of b // as expression replaced is (++a>++b? ++a: ++b) This just takes the passed arguments and replaces them in the expression. Then compilation evaluates it. PRO-C: C+SQL Acts as a translator 2 3