CompilerReport

Download Report

Transcript CompilerReport

Compiler
Term
Project

B84506024
Tien-Hsin Lee
Features:
• Expression: ‘+’, ‘-’, ‘*’, ‘/’, ‘%’, ‘<‘, ‘>’, ‘? :’
‘+=‘, ‘++i’, …..
• Basic type expression: integer, float, double, char
• Multiarray expression: A[i+3][j*4]+B[5]
• Nested structures expression: R.a.aa + S.b.bb
• Function expression: i = f1*3 + f2
• Function calls: double f1(int a, float b)
• Control statements: for, while, do, if-else-then
• Recursive function calls
Term Project Presentation

報告流程
•
•
•
•
•
•
Scanner & Parser
Symbol Table
Semantic Record Data Structure
Declaration
Expression
Control Flow
Scanner

Input: scan.l

flex
What’s up in scan.l?
•
•
•
•
Output: lexyy.c
Token: yytext
check_type( ): return identifier or type_name
count( ): return line and column of a token
SlideCompile( ): the main function
Parser

Input: gram.y

Declaration
Expression
Control Statement
I/O Statement



Output: gram_tab.h&
yacc
gram_tab.cpp
SYMBOL TABLE
•Each function has its own symbol table
•Global symbol table is visible everywhere
Symbol Table
Symbol Table
•Push a symtab_class pointer into sym_stack
while entering a function scope.
Semantic Data Structure

Semantic Record
• Record kind
• ID, TYPEREF, ID_LIST, DATAOBJECT,
TOKENOBJECT, USERTYPE, PARAM_LIST,
RECORDDEF, CONSTOPTION, ERRORREC
• Semantic data
DataObject in Semantic Record

OBJECTVALUE:
Literal values including int,float..basic types

OBJECTNAME:
Declared non-pointer variables

OBJECTARRAY:
Declared array

OBJECTRECORD:
Declared record
DataObject …(more)

OBJECTTEMP:
The most common type of DataObject that is
carried in the semantic record. Whenever an
expression is evaluated, it becomes an
OBJECTTEMP. The code generated will be
carried as well.
More about OBJECTTEMP...


How to become an OBJECTTEMP?
Why OBJECTTEMP needs to bring code?
Due to the bottom up parsing design and different
combination of binary operation.

When is the right time to generate code into
the output file?
Expression

Unary_Operation:
• +, -, ~, !, ++, --


TypeCast_Operation:
Arithmetic_Operation
• *, /, %, +, -

Shift_Operation
• >>, <<
Expression…(more)

Relational_Operation:
• <, >, <=, >=, !=, ==

Bitwise_Operation:
• &, ^, |

Logic_Operation:
• &&, ||
ps. According to precedence rule
Expression


Semantic Routines ( Call by Parser)
Process literal
• TRUE ,FALSE, INTEGER, REAL

Process Operator
• Type :Token ,Record operator

Eval_operator
• Unary: not Binary : relation , +,-,*,/
Expression

Sematic_Record
• Record-Kind
Error ,ID ,Array , Range,DataObject,Token(op)
If_Stmt Do_For Do_While
BlockFormat CyclicFormat
• Semantic-data
• Next : point to another Semantic _Record
Expression


It must be DataObject .op. DataObject
or .op. DataOject
DataObject has four types
•
•
•
•
ObjectName
ObjectValue
ObjecTemp
ObjectArray
Expression

Case 1: ObjectValue .op. ObjectValue
“ +-*/ ”=>Compute it directive and turn value

Case 2: ObjectArray operation
• NotTemplate
A(I1,I2,...In)=>A[I1][I2]....[In]
• Template
A(I1,I2,...In)=>hpf_read_A(I1,I2,..In,temp[J])
Expression

Other Case:
• ObjectName,ObjectTemp,ObjectValue
• Use it Directively
• Return temp[index]

Error Detect
• simple process
Next Presentation

報告流程
•
•
•
•
•
•
•
Scanner & Parser
Semantic Data Structure
Symbol Table
Expression
Control
Assignment
HPF
Symbol Table 1/4
Symbol Table 2/4
Symbol Table 3/4
IF statement
IF expr THEN
IF expr THEN
IF expr THEN
ENDIF
ENDIF
ENDIF
Assignment

Left Hand Side
• Variable
• Array Element
• Vector Operand

Right Hand Side
•
•
•
•
Value
Variable
Temp Variable
Array Element
• Vector Operand
Vector Operand Assignment
V_C(1:5:2) = V_D(1:5:2)
for(index[0]=1,index[1]=3;index[0]<=5;index[0]+=2,index[1]++)
int_temp[index[1]] = V_D[index[0]];
for(index[0]=1,index[1]=3;index[0]<=5;index[0]+=2,index[1]++)
V_C[index[0]] = int_temp[index[1]];
HPF Directive
TEMPLATE
PROCESSOR
ALIGN
DISTRIBUTE
TEMPLATE




flag: IsTemplate , in attribute record
Setting IsTemplate flag in ALIGN &
DISTRIBUTE
for Testing whether HPF_READ/WRITE
Connect type_descriptor to Semantic
Record (id_type)
PROCESSORS
!HPF$ PROCESSORS P(3,5)
int hpf_P[3][5]
called in-main:void hpf_create_processor_P()
Using for loop.........
{hpf_create_processor(&hpf_P[][],X) ;}
X:P(x)(y) --> using for to do ()()
ALIGN(1/2)
!HPF$ ALIGN A(I,J,K) WITH T(I,11*J-9)



Using In HPF_READ/WRITE
Need to calculate address of A on T
being called in hpf_read_A/hpf_write_A for
actual distributed elements of A.
ALIGN(2/2)


For each ALIGN, we generate a function
calculating address.
Index_ArrayName(int dim, int_index_list)
•
•
•
•
•
dim : which dimension to compute
index_list : array index to convert
function_Name():set subFuncName;
gen_index_func():generate function header
gen_case():produce each dimension case.
DISTRIBUTE(1/4)
!HPFS DISTRIBUTE T(BLOCK,CYCLIC(4)) ONTO P


Generate 3 functions for each distributed_array
• hpf_declare_ArrayName
• hpf_read_ArrayName
• hpf_write_ArrayName
Handle distribute-data methods in dimension.
• In Semantic Record :
• BLOCK(X) : BLOCKFORMAT , block_value;
• CYCLIC(Y) : CYCLICFORMAT, cyclic_value;
DISTRIBUTE(2/4) -- hpf_declare_A



Allocate memory space for array in each
processor.
char* hpf_A[][];
Using multi-for-loop to declare array,
according to Processor Number.
hpf_declare(hpf_P[][],size,&hpf_A[][])
DISTRIBUTE(3/4) -- hpf_(read/write)_A
void hpf_(read/write)_A(int_index_list, int *data)



Call Index_Function to calculate ALIGN
address.
Compute offset in each processor according
to BLOCK and CYCLIC structure.
Call hpf_(read/write) of pvm
DISTRIBUTE(4/4) -- Generated Codes
A(1,2,3) = B(3,2,1)
hpf_read_B(3,2,1,&int_temp[2]);
hpf_write_A(1,2,3,int_temp[2]);
Initialization & Close

HPF_Initialization
• Create Processor
• Declare Array

HPF_Close
• hpf_end(&hpf_P[][], ... );
• pvm_exit();
Demo ....................
HPF Generated Code
&
Running on PVM