• No results found

Compiler Compiler Tutorial

N/A
N/A
Protected

Academic year: 2021

Share "Compiler Compiler Tutorial"

Copied!
109
0
0

Loading.... (view fulltext now)

Full text

(1)Compiler Compiler Tutorial CSA2010 – Compiler Techniques. Gordon Mangion.

(2) Introduction . With so many Compilers around, do we need to write parsers/compilers in industry?. FTP interface  Translator from VB to Java  EPS Reader  NLP .

(3) Topics Prerequisites  Compiler Architecture/Modules  JavaCC  Virtual Machines  Semantic Analysis  Code Generation and Execution  Examples  The assignment (SL Compiler) .

(4) Prerequisites . Java. . Regular Expressions ◦?+*…. . Production rules and EBNF. . Semantics.

(5) Regular Expressions. . ◦ Repetitions + = 1 or more * = 0 or more ? = 0 or 1. ◦ Examples a+ - a, aa, aaa b* - , b, bb c? - ,c. . ◦ Alternative a | b = a or b. a | b - a, b.  .   . ◦ Ranges [a-z] [fls] [^cde]. = a to z = f, l and s = not c,d,e. - a,b,c,d,e,f,g,…,y,z - f,l,s - a,b,f,g,…,y,z.

(6) Compiler . What is a compiler? ◦ Where to start from? ◦ Design / Architecture of a Compiler.

(7) Compiler . Is essentially a complex function which maps a program in a source language onto a program in the target language. Compiler. Source Code. Lexical Analysis. Syntax Analysis. Semantic Analysis. Error Handler. Target Code. I-Code Optimiser Symbol Table. Code Execution. Code Generator. …. Optimiser. Code Optimiser. ….

(8) Translation Source Code. int Sqr( int x ) { var int n = x; n = n * n; return n; }. Target Code push mov sub push push push lea mov mov rep stos mov mov mov imul mov mov pop pop pop mov pop ret. ebp ebp,esp esp,0CCh ebx esi edi edi,[ebp-0CCh] ecx,33h eax,0CCCCCCCCh dword ptr es:[edi] eax,dword ptr [x] dword ptr [n],eax eax,dword ptr [n] eax,dword ptr [n] dword ptr [n],eax eax,dword ptr [n] edi esi ebx esp,ebp ebp.

(9) Translation Source Code. int Sqr( int x ) { var int n = x; n = n * n; return n; }. Compiler. All possible translations of the source program.

(10) Translation Source Code. int Sqr( int x ) { var int n = x; n = n * n; return n; }. Target Code push. ebp. mov sub push. ebp,esp esp,0CCh ebx. push push. esi edi. lea mov mov. edi,[ebp-0CCh] ecx,33h eax,0CCCCCCCCh. rep stos. dword ptr es:[edi]. mov mov. eax,dword ptr [x] dword ptr [n],eax. mov imul mov. eax,dword ptr [n] eax,dword ptr [n] dword ptr [n],eax. mov. eax,dword ptr [n]. pop. edi. pop. esi. pop mov pop ret. ebx esp,ebp ebp.

(11) Production Rules . Context Free Grammars ◦ A  B “c” D. . BNF ◦ A ::= B “c” D. . EBNF ◦ A ::= B* “c”? D+.

(12) The Language game Source Language  Target Language  Implementation Language . ….

(13) Tombstone Diagram Source Language. Target  Implementation Language. Language.

(14) Lexical Analysis. Syntax Analysis. Intermediate Code. Source Language. Source Code. Tokens. Compiler Architecture. Error Handler. Semantic Analysis Intermediate Code I-Code Optimiser Intermediate Code. Symbol Table. Code Execution. Code Generator. …. Optimiser. Code Optimiser. ….

(15) Simplified Compiler Architecture Source Code. Source Language. Lexical Analysis Tokens Syntax Analysis Intermediate Code. Symbol Table. Semantic Analysis Intermediate Code Code Generator. Target Code.

(16) Lexical Analysis . Tokenises the source file ◦ Removes whitespace ◦ Tokens ◦ Keywords. Source Code. function Sqr( x : int ) : int { let n : int = x; n <- n * n; return n; }. Function Sqr ( X : Int ) : Int { Let N : Int = X ; …. (Keyword) (Identifier) (Lparen) (Identifier) (Colon) (Keyword) (Rparen) (Colon) (Keyword) (Lbrace) (Keyword) (Identifier) (Colon) (Keyword) (Eq) (Identifier) (Semicolon).

(17) Syntax Analysis (Parser) . Checks that the source file conforms to the language grammar ◦ E.g. FunctionDecl ::= “function” identifier “(“ … Source Code. . function Sqr( x : int ) …. . Source Code. function 1.5( x : int ) …. SimpleExpr. Creates intermediate code ◦ ParseTree. . 2. +. 5.

(18) Semantic Analysis . Checks that the meaning behind the syntax makes sense, according to the type-system ◦ E.g.. var int x = 3; x:int, 3:int. ◦ E.g.. var int x = 3.2; x:int, 3.2:Real.  .

(19) Code Generation / Execution . Traverses the Intermediate Code representation and generates or executes the code + 2. 5. PlusNode.Generate() { leftChild.Generate() ; rightChild.Generate(); EmitCode(Add); }. IntLiteralNode.Generate() { EmitCode ( Push, Integer.parseInt(this.getValue()) ); }.

(20) Symbol Table . Important Data Structure. ◦ Keeps information about every identifier in the source  Variables  functions  Labels …. ◦ Keeps the scope information ◦ Entry Properties    . Name Type Value Scope.

(21) Symbol Table A data structure that maps an Identifier’s name onto a structure that contains the identifier’s information Name  ( Name, Type, Value, Scope ).

(22) Symbol Table . Easiest way is to make use of a hash-table / hash-map. . Create a new Hash-map for each new scope.

(23) Java Interfaces . Interface is a contract. . If a Class implements interface ◦ Honours the contract ◦ Implements the methods of the interface. . Interface type variable can hold instance of a class that implements that interface.

(24) Java Interfaces public interface IAdder { int add(int n, int m); }. public interface IMinus { int subtract(int n, int m); }.

(25) Java Interfaces public interface IAdder { int add(int n, int m); }. public class SimpleMath implements IAdder, IMinus { public int add(int n, int m) {…} public int subtract(int n, int m) {…} }. public interface IMinus { int subtract(int n, int m); }.

(26) Java Interfaces public interface IAdder { int add(int n, int m); }. public class SimpleMath implements IAdder, IMinus { public int add(int n, int m) {…} public int subtract(int n, int m) {…} }. public interface IMinus { int subtract(int n, int m); }. public static void main(…) { IAdder a = new SimpleMath(); IMinus s = new SimpleMath(); a.add(1,2); s.subtract(4,2); }.

(27) Java Interfaces. public interface ICalculator { int Calculate(int n, int m); }.

(28) Java Interfaces public class Mul implements ICalculator { public int Calculate(int n, int m) {…n*m…} }. public interface ICalculator { int Calculate(int n, int m); }. public class Div implements ICalculator { public int Calculate(int n, int m) { … n / m …}.

(29) Java Interfaces public class Mul implements ICalculator { public int Calculate(int n, int m) {…n*m…} }. public interface ICalculator { int Calculate(int n, int m); }. public class Div implements ICalculator { public int Calculate(int n, int m) { … n / m …}. public static void main(…) { ICalculator c1 = new Mul(); ICalculator c2 = new Div(); c1.Calculate(4,2); c2.Calculate(4,2); }.

(30) Simplified Compiler Architecture Source Code. Source Language. Lexical Analysis Tokens Syntax Analysis Intermediate Code. Symbol Table. Semantic Analysis Front-End Back-End. Intermediate Code Code Generator. Target Code.

(31) Compiler Architecture Compiler Implementation Lexical Analysis. Parser. Source Code. Symbol Table. Call Visitor. Visitor Interface. Parse Tree. Call Visitor. Visitor Interface. Compiler Interface. (Syntax Analysis). …. Type-Checker (Semantic Analysis). Code Execution.

(32) Program Generators? . Source-to-Executable ◦ Compiler. . Reverse Polish Notation ◦2+3-4. . . Source-to-Source ◦ Preprocessors. 23+4-.

(33) Javacc . A program that creates parsers. . The source code(input) is a definition file ◦ Grammar definition ◦ Inline Java code. . The target(output) is java-based parser. . Recognizer?.

(34) Javacc langdef.jj. Javacc. *.java *.java *.java *.java.

(35) JJTree . Preprocessor to Javacc. . Creates “.jj” files from “.jjt” files. . From a recognizer to a proper parser. . Produces Parse Tree building actions.

(36) JJTree langdef.jjt. JJTree. langdef.jj. Javacc. *.java *.java *.java *.java.

(37) JJTree langdef.jjt. langdef.jj. JJTree “J J T”. TOOL. Javacc. *.java *.java *.java *.java.

(38) Installing Javacc . https://javacc.dev.java.net/ ◦ Javacc.zip / Javacc.tar.gz. . Eclipse plugin ◦ Preferences->Install/Update->Add  http://eclipse-javacc.sourceforge.net/. ◦ Help->New Software ◦ Newer versions  Eclipse Marketplace.

(39) .jjt Grammar Files . Four (4) sections ◦ ◦ ◦ ◦. Options Parser Tokens Production Rules.

(40) .jjt Options options { BUILD_NODE_FILES=false; STATIC=false; MULTI=true; … }.

(41) .jjt Parser block PARSER_BEGIN(parser_name) ... public class parser_name { … } … PARSER_END(parser_name).

(42) .jjt Tokens . Lexeme to ignore SKIP : { “” | “\t” | “\n” | “\r” | <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n")> }.

(43) .jjt Tokens . Tokens that are to be returned TOKEN : { <PLUS: “+”> |<TRUE: "true" > | <FALSE: "false" > | <LETTER: (["A"-"Z"] | ["a"-"z"]) > | <STRING_LITERAL: "\"" (~["\"","\r","\n"])* "\"" > | <#DIGIT: [“0”-”9”]> }.

(44) .jjt Production Rules . Assume the following:. Header  “Script” <STRING_LITERAL> or Header ::= “Script” <STRING_LITERAL>.

(45) .jjt Production Rules . Assume the following:. Header ::= “Script” <STRING_LITERAL> void Header(): { <SCRIPT> <STRING_LITERAL> }.

(46) .jjt Production Rules Header ::= “Script” <STRING_LITERAL> void Header(): { int n = 0; n++;} { <SCRIPT> <STRING_LITERAL> }.

(47) .jjt Production Rules . Token matching - Actions. void Header(): { int n = 0; n++; } { <SCRIPT>{ n = 1; } <STRING_LITERAL> { n++; } }.

(48) .jjt Production Rules . Calling Non-Terminals. void Integer(): {} {…} void Header(): { } { <SCRIPT> Integer() }.

(49) .jjt Production Rules . Getting Token value. void Number() { Token t; int n = 0; } { t=<DIGIT>{ n = integer.parseInt(t.image); } }.

(50) Lookahead . Consider the following java statements ◦ public int name; ◦ public int name[]; ◦ public int name() { … }.

(51) Building the AST (Abstract Syntax Tree) options { STATIC=false; MULTI=true; BUILD_NODE_FILES=true; NODE_USES_PARSER=false; NODE_PREFIX=“”; // default “AST” … }.

(52) Building the AST SimpleNode Start() : {} { Expression() “;” <EOF> // Special Token { return jjtThis; } }.

(53) Parsing PARSER_BEGIN(MyParser) ... MyParser parser = new MyParser(System.in); try { SimpleNode n = parser.Start(); System.out.println(“Parsed!"); } catch (Exception e) { System.out.println("Oops!"); System.out.println(e.getMessage()); } ... PARSER_END(MyParser).

(54) Example Digit ::= [“0” - “9”] Number ::= Digit+ Plus ::= “+” Minus ::= “-”. Op ::= Plus | Minus Expression ::= Number { Op Number }.

(55) Example TOKEN: { < NUMBER: <DIGIT>+ > | < Digit: [“0” - “9”] > | < PLUS: “+” > | < MINUS: “-” > }. Digit ::= [“0” - “9”] Number ::= Digit+ Plus ::= “+” Minus ::= “-”.

(56) Example void Op() :{} { < PLUS > | < MINUS > } void Expression(): {} { < Number > (Op() < Number >)* }. Op ::= Plus | Minus. Expression ::= Number { Op Number }.

(57) Example PARSER_BEGIN(MyParser) ... MyParser parser = new MyParser(System.in); try { parser.Expression(); System.out.println(“Parsed!"); } catch (Exception e) { System.out.println("Oops!"); System.out.println(e.getMessage()); } ... PARSER_END(MyParser).

(58) Generated Sources.

(59) Example – Evaluating Token Op() : { Token t; } { (t = < PLUS > | t = < MINUS >) { return t; } }.

(60) Example int Expression(): { Token t, op; int n;} { t = < NUMBER > { n = Integer.parseInt( t.image ); } ( op=Op() t = < NUMBER > {. if(op.image.equals("+")) n += Integer.parseInt( t.image ); else n -= Integer.parseInt( t.image ); } )* { return n; } }.

(61) Example PARSER_BEGIN(MyParser) public class MyParser { ... MyParser parser = new MyParser(System.in); try {. int n = parser.Expression(); ... PARSER_END(MyParser).

(62) Example - Building the AST options { STATIC=false; MULTI=true; BUILD_NODE_FILES=true; NODE_USES_PARSER=false; NODE_PREFIX=“AST”; … }.

(63) Generated Code.

(64) Example void Op() :{} { < PLUS > | < MINUS > } SimpleNode Expression(): {} { < Number > (Op() < Number >)* { return jjtThis; } }. Op ::= Plus | Minus. Expression ::= Number { Op Number }.

(65) Example PARSER_BEGIN(MyParser) public class MyParser { ... MyParser parser = new MyParser(System.in); try {. SimpleNode rootNode = parser.Expression(); ... PARSER_END(MyParser).

(66) Example Grammar 2 Digit ::= [“0” - “9”] Number ::= Digit+ Factor ::= Expression | Number Term ::= Factor [ “*” | “/” Factor ] Expression ::= Term { “+” | “-” Term } Start ::= Expression.

(67) The Visitor Design Pattern . The Problem ◦ Number of operations to be performed on each node. +. 2. *. A. ◦ Options 7.  Implement each operation inside each node  Make use of visitor pattern.

(68) The Visitor Design Pattern . Consider one Node ◦ Printing Operation  PrintVisitor. Plus. We can implement the operation in a separate class e.g. PrintVisitor. void PrettyPrint( Plus ) { … }. . This can be done for all type of nodes.

(69) The Visitor Design Pattern . Modification on node Plus void Print( Visitor p_visitor) { p_visitor.PrettyPrint( this ); }. . Client Caller { PrintVisitor pr = new PrintVisitor(); Plus plus … plus.Print(pr); }. PrintVisitor void PrettyPrint( Plus ) { …. }.

(70) The Visitor Design Pattern . Finally Plus void Accept( IVisitor p_visitor) { p_visitor.Visit( this ); }. Caller { PrintVisitor pr = new PrintVisitor(); Plus plus … plus.Accept(pr); }. Interface IVisitor void Visit( Plus );. PrintVisitor implements IVisitor void Visit( Plus ) { … }.

(71) The Visitor Design Pattern . Benefits Plus void Accept( IVisitor p_visitor) { p_visitor.Visit( this ); }. PrintVisitor implements IVisitor void Visit( Plus ) {…} void Visit( Times ) {…}. TypeCheckVisitor implements IVisitor void Visit( Plus ) {…} void Visit( Times ) {…}. Interface IVisitor void Visit( Plus ); void Visit( Times );. EvaluationVisitor implements IVisitor void Visit( Plus ) {…} void Visit( Times ) {…}.

(72) Compiler Architecture Compiler Implementation Lexical Analysis. Parser. Source Code. Symbol Table. Call Visitor. Visitor Interface. Parse Tree. Call Visitor. Visitor Interface. Compiler Interface. (Syntax Analysis). …. Type-Checker (Semantic Analysis). Code Execution.

(73) JJTree and the Visitor Pattern Options { … VISITOR=true; … }.

(74) Visitor interface public interface MyParserVisitor { public Object visit(SimpleNode node, Object data); public Object visit(ASTOp node, Object data); public Object visit(ASTExpression node, Object data); }.

(75) Visitor - Node modification Public class ASTExpression extends SimpleNode { public ASTExpression(int id) { super(id); } public ASTExpression(MyParser p, int id) { super(p, id); } /** Accept the visitor. **/ public Object jjtAccept(MyParserVisitor visitor, Object data) { return visitor.visit(this, data); } }.

(76) JJTree and the Visitor Pattern Options { … VISITOR=true; VISITOR_DATA_TYPE=“SymbolTable”; VISITOR_RETURN_TYPE=“Object”; … }.

(77) Visitor - return type . We need a return-type generic enough to accommodate the results returned by all the visitor implementations. . By default jjt uses the Object class ◦ Can easily be used however  class-casts  instanceof. . A generic container can be designed to hold the results.

(78) Visitor - return type . Types – ◦ Create an enumeration containing the types of the language’s type-system.. . This should always be created. enum DataType { None (/ Unknown), Error, Skip (/ Command), Bool, Int, Function, … }.

(79) Visitor - return type . Result class Class Result { DataType type; Object value; … Getter & Setter Conversion … }.

(80) Visitor - return type . We can make use of: ◦ Object  Most generic return type  Have to cast to proper instance. ◦ DataType  When the Type of the node suffices. ◦ Result class  When we need to return some data.

(81) SymbolTable . Entry ◦ String Name ◦ DataType Type ◦ Value?. Name  Entry.

(82) SymbolTable . Entry ◦ ◦ ◦ ◦. String Name DataType Type Int ScopeLevel Var / Param. ◦ ◦ ◦ ◦. DataType ReturnType Int VarCount Int ParamCount (Entry Containter).

(83) Type-Checking – (Semantic Analysis) . SemanticAnalyser ◦ (implements Visitor). . Consider ◦ BooleanLiteral() public DataType visit( ASTBooleanLiteral node, SymbolTable data). { return DataType.Bool; }.

(84) Type-Checking – (Semantic Analysis) . Consider ◦ Identifier() public Object visit( ASTIdentifier node, SymbolTable data ) { // Get name from the node String name = (String)node.jjtGetValue(); Consult symboltable, check if name exist if yes return its DataType println(“Error ASTIdentifier : " + name); return DataType.Error; }.

(85) Type-Checking – (Semantic Analysis) . Consider =. Assignment(): { Identifier() <ASSIGN> Expression(). Expr. Ident. } SimpleExpr. 3. +. 2.

(86) Type-Checking – (Semantic Analysis) . Consider ◦ Assignment(): { Identifier() <ASSIGN> Expression() }. public Object visit(ASTAssignment node, SymbolTable data ) { // Check identifier DataType identType = node.jjtGetChild(0).visit(this, data); if(identType == DataType.Error) return DataType.Error;.

(87) Type-Checking – (Semantic Analysis) . Consider ◦ Assignment(): { Identifier() <ASSIGN> Expression() }. … // Check expresion DataType exprType = node.jjtGetChild(1).visit(this, data); if(identType != exprType) { println(“Error ASTAssignment”); return DataType.Error; } return DataType.Skip; }.

(88) Type-Checking – (Semantic Analysis) Note the difference in the use of identifiers when they are: L-value  R-value . [a=2+3] [x=a+4].

(89) Type-Checking – (Semantic Analysis) . Consider the following decision rule ◦ IfStatement ::= “if” “(“ Expression “)” … if( 3 + 2 ) {. if. …. }. Expression. Statement Block. Statement Block. …. …. ….

(90) Type-Checking – (Semantic Analysis) . Use node.jjtGetNumChildren() to get the number of children the node has.. . This determines the shape of the tree. . examples are ◦ ◦ ◦ ◦. If Statement Variable Declaration Initialiser (var int n = 0;) Function Delaration Statement Block.

(91) Type-Checking – (Semantic Analysis) . Implement the call to the visitor:. Public class MyParser { ... main ... Try { SimpleNode root = parser.Expression(); MyParserVisitor visitor = new TypeChecker(); Result result = root.jjtAccept(visitor, null ); System.out.println("DataType is " + result .getType().toString()); ....

(92) Interpreter – Code Execution . In a similar way to Semantic Analysis, we can make use of the visitor pattern. . This time, we return values as well rather than type-information only. . We have to take special care about the difference in the semantics of the languages involved.

(93) Code Generation . Once again we make use of the visitor pattern. . In this stage we traverse the parse-tree and emit target language code in our case S-Machine instructions. . In particular, we traverse nodes and emit code patterns.

(94) SymbolTable . Entries require an “Offset” variable ◦ For data related nodes, “Offset” is the actual offset in the Stack. ◦ For flow control nodes, “Offset” holds the location in the Code Area.

(95) Code Generation . Since we are emitting S-Machine instructions, it is wise to create an enum of the instructions. public enum SMInstruction {. NOP, LDC, LD, STORE, DUP, … }.

(96) Code Generation  At. the end of the whole process we are writing a binary file which is the compiled program..  It. is a good idea to create a buffer and perhaps a class that takes care of it.  When. the process finished, the buffer is then written to disk.

(97) CodeBuilder . class CodeBuilder ◦ Byte[] codeBuffer. ◦ Int GetCodePosition() ◦ void AddInstruction(SMInstruction inst) ◦ void AddInstruction(SMInstruction inst, int nScope, int nArg) ◦ void WriteCode(String p_strPath).

(98) CodeGenerator Class CodeGenerator Implements Visitor CodeGenerator(CodeBuilder cb) Int GetCodeOffset() Void Emit( SMInstruction inst, int nScope, int nArg) Void Emit( SMInstruction inst, int nArg) Void Emit( SMInstruction inst ).

(99) CodeGenerator . Endianess ◦ CodeBuffer[Offset+2] = (nArg & 0xFF00)>>8 ◦ CodeBuffer[Offset+3] = (nArg & 0xFF).

(100) CodeGenerator . Consider Literal. public Object visit( ASTIntegerLiteral node, SymbolTable data) { // LDC n Emit( SMInstruction.LDC, 0,. (Integer)node.jjtGetValue() ); return SLType.Skip; }.

(101) CodeGenerator . Consider Identifier. public DataType visit( ASTIdentifier node, SymbolTable data) { //Get name from node //Get Entry from symbolTable //If Param … //Else if Var … Emit( SMInstruction.LD, …entry.Scope… , entry.Offset );. return DataType.Skip; }.

(102) CodeGenerator . Consider Assignment. public DataType visit( ASTAssignment node, SymbolTable data ) { name = get name from node 0 entry = data.get(name);. node.jjtGetChild(1).jjtAccept(this, data); Emit( SMInstruction.STORE, entry.Scope, entry.Offset); return DataType.Skip; }.

(103) CodeGenerator . Consider While ◦ Can you identify a potential problem?. Location_of_Condition: 00 Code for Condition 01 JZ Out_Of_While 02 Code for While_Block 03 JMP Location_of_Condition Out_Of_While: 04.

(104) CodeGenerator . Consider While. public Object visit(ASTWhileStatement node, SymbolTable data) { int addrCond = GetCodeOffset(); node.jjtGetChild(0).jjtAccept(this, data); int addrJump = GetCodeOffset(); Emit(SMInstruction.JZ, 0, 0); node.jjtGetChild(1).jjtAccept(this, data); Emit(SMInstruction.JMP, 0, addrCond); int addrEnd = m_codeBuilder.GetCodePos(); BackPatch(addrJump, addrEnd); return SLType.Skip; }.

(105) CodeGenerator . BackPatch( address of instruction, new address);. . Modifies the address argument of an instruction.

(106) CodeGenerator . Consider While. public Object visit(ASTWhileStatement node, SymbolTable data) { int addrCond = GetCodeOffset(); node.jjtGetChild(0).jjtAccept(this, data); int addrJump = GetCodeOffset(); Emit(SMInstruction.JZ, 0, 0); node.jjtGetChild(1).jjtAccept(this, data); Emit(SMInstruction.JMP, 0, addrCond); int addrEnd = m_codeBuilder.GetCodePos(); BackPatch(addrJump, addrEnd); return SLType.Skip; }.

(107) CodeGenerator . Consider FunctionDecl. public DataType visit(ASTFunctionDecl node, SymbolTable data) { Get Entry from symboltable for node 0 Set symboltable Scope to that of entry; entry.Offset = GetCodeOffset(); Emit(SMInstruction.ENTER, 0, entry.VarNum); if(node.jjtGetNumChildren() == 4) node.jjtGetChild(3).jjtAccept(this, data); else node.jjtGetChild(2).jjtAccept(this, data); restore symboltable scope return DataType.Skip; }.

(108) CodeGenerator . Consider Program ◦ Function Declarations are generated first ◦ Start code with a jmp instruction ◦ Enter a new scope.

(109) Questions?. The End.

(110)

References

Related documents

In order to test our view that child molesters turn to children for sex, comfort and intimacy because they do not have the capacity necessary to meet these needs with adults,

Additional requirement in present document The requirements in the original table for Band VII apply to Bands XV and XVI as well... 8.2.6.2 UE Rx-Tx time difference

The goals of this study, undertaken on Bouvetøya, were (1) to determine if the first trip to sea after instrumentation is representative of subsequent trips in lactating Antarctic

El objetivo de este artículo es, por una parte, analizar si el número sin precedentes de alcaldesas y concejalas escogidas en las elecciones locales de 2014 ha

Be abejonės, teisiškai socialinės paslaugos negali būti teikiamos asmenims, ne - deklaravusiems gyvenamosios vietos tame mieste, kur jie siekia gauti tam tikras socialines

The OpenStage 30T/40/40G/40T always requires a local power supply (SMPS mains adapter, must be ordered separately) if an OpenStage Busy Lamp Field 40 is connected.. The PNOTE

To determine the goodness of the metaheuristics considered in this work, this section presents a comparison of the results from the best performing algorithm (SA) with

IDL Client function RPC Compiler Client stub Data conversion Headers Data conversion Server skeleton Server function Compiler Compiler Client Server Written code Generated code