ROSE Tutorial: a Tool for Building Source-To-Source Translators Draft Tutorial (Version 0.9.11.115)

Total Page:16

File Type:pdf, Size:1020Kb

ROSE Tutorial: a Tool for Building Source-To-Source Translators Draft Tutorial (Version 0.9.11.115) ROSE Tutorial: A Tool for Building Source-to-Source Translators Draft Tutorial (version 0.9.11.115) Daniel Quinlan, Markus Schordan, Richard Vuduc, Qing Yi Thomas Panas, Chunhua Liao, and Jeremiah J. Willcock Lawrence Livermore National Laboratory Livermore, CA 94550 925-423-2668 (office) 925-422-6278 (fax) fdquinlan,panas2,[email protected] [email protected] [email protected] [email protected] [email protected] Project Web Page: www.rosecompiler.org UCRL Number for ROSE User Manual: UCRL-SM-210137-DRAFT UCRL Number for ROSE Tutorial: UCRL-SM-210032-DRAFT UCRL Number for ROSE Source Code: UCRL-CODE-155962 ROSE User Manual (pdf) ROSE Tutorial (pdf) ROSE HTML Reference (html only) September 12, 2019 ii September 12, 2019 Contents 1 Introduction 1 1.1 What is ROSE.....................................1 1.2 Why you should be interested in ROSE.......................2 1.3 Problems that ROSE can address...........................2 1.4 Examples in this ROSE Tutorial...........................3 1.5 ROSE Documentation and Where To Find It.................... 10 1.6 Using the Tutorial................................... 11 1.7 Required Makefile for Tutorial Examples....................... 11 I Working with the ROSE AST 13 2 Identity Translator 15 3 Simple AST Graph Generator 19 4 AST Whole Graph Generator 23 5 Advanced AST Graph Generation 29 6 AST PDF Generator 31 7 Introduction to AST Traversals 35 7.1 Input For Example Traversals............................. 35 7.2 Traversals of the AST Structure............................ 36 7.2.1 Classic Object-Oriented Visitor Pattern for the AST............ 37 7.2.2 Simple Traversal (no attributes)....................... 37 7.2.3 Simple Pre- and Postorder Traversal..................... 37 7.2.4 Inherited Attributes.............................. 38 7.2.5 Synthesized Attributes............................. 44 7.2.6 Accumulator Attributes............................ 47 7.2.7 Inherited and Synthesized Attributes..................... 48 7.2.8 Persistent Attributes.............................. 51 7.2.9 Nested Traversals................................ 54 7.2.10 Combining all Attributes and Using Primitive Types............ 56 iii iv CONTENTS 7.2.11 Combined Traversals.............................. 57 7.2.12 Short-Circuiting Traversals.......................... 63 7.3 Memory Pool Traversals................................ 66 7.3.1 ROSE Memory Pool Visit Traversal..................... 66 7.3.2 Classic Object-Oriented Visitor Pattern for Memory Pool......... 68 7.3.3 ROSE IR Type Traversal (uses Memory Pools)............... 69 8 Graph Processing Tutorial 73 8.1 Traversal Tutorial................................... 73 9 Scopes of Declarations 77 9.1 Input For Examples Showing Scope Information.................. 77 9.2 Generating the code representing any IR node.................... 78 10 AST Query 81 10.1 Simple Queries on the AST.............................. 81 10.2 Nested Query...................................... 81 11 AST File I/O 87 11.1 Source Code for File I/O................................ 87 11.2 Input to Demonstrate File I/O............................ 87 11.3 Output from File I/O................................. 87 11.4 Final Code After Passing Through File I/O..................... 87 12 Debugging Techniques 91 12.1 Input For Examples Showing Debugging Techniques................ 91 12.2 Generating the code from any IR node........................ 92 12.3 Displaying the source code position of any IR node................. 92 II Complex Types 95 13 Type and Declaration Modifiers 97 13.1 Input For Example Showing use of Volatile type modifier............. 97 13.2 Generating the code representing the seeded bug.................. 98 14 Function Parameter Types 101 15 Resolving Overloaded Functions 105 16 Template Parameter Extraction 109 17 Template Support 113 17.1 Example Template Code #1.............................. 113 17.2 Example Template Code #2.............................. 113 CONTENTS v III Program Analyses 115 18 Generic Dataflow Analysis Framework 117 18.1 Basics of DataFlowAnalysis.............................. 117 18.2 ROSE Dataflow Framework.............................. 119 18.2.1 Call and Control-Flow Graphs........................ 119 18.2.2 Analyses..................................... 119 18.2.3 Dataflow.................................... 121 18.2.4 Transferring Information Between Analyses................. 130 18.2.5 CFG Transformations............................. 132 19 Recognizing Loops 135 20 Virtual CFG 139 20.1 CFGNode Index values................................. 139 20.2 Important functions.................................. 140 20.2.1 Node methods................................. 140 20.2.2 Edge methods.................................. 140 20.3 Drawing a graph of the CFG............................. 141 20.4 Robustness to AST changes.............................. 148 20.5 Limitations....................................... 148 20.5.1 Fortran support................................ 148 20.5.2 Exception handling............................... 148 20.5.3 Interprocedural control flow analysis..................... 148 20.6 Node filtering...................................... 148 20.6.1 \Interesting" node filter............................ 148 20.6.2 Arbitrary filtering............................... 149 20.7 Static CFG....................................... 149 20.7.1 Class methods................................. 149 20.7.2 Drawing a graph of the CFG......................... 150 20.8 Static, Interprocedural CFGs............................. 150 21 Generating Control Flow Graphs 153 22 Graph Processing Tutorial 157 22.1 Traversal Tutorial................................... 157 23 Dataflow Analysis 161 23.1 Def-Use Analysis.................................... 161 23.1.1 Def-use Example implementation....................... 161 23.1.2 Accessing the Def-Use Results........................ 162 23.2 Liveness Analysis.................................... 165 23.2.1 Access live variables.............................. 165 24 Generating the Call Graph (CG) 171 25 Dataflow Analysis based Virtual Function Analysis 175 vi CONTENTS 26 Generating the Class Hierarchy Graph 179 27 Database Support 183 27.1 ROSE DB Support for Persistent Analysis...................... 183 27.2 Call Graph for Multi-file Application......................... 183 27.3 Class Hierarchy Graph................................. 183 28 Building Custom Graphs 189 IV Program Transformations and Optimizations 191 29 Generating Unique Names for Declarations 193 29.1 Example Code Showing Generation of Unique Names................ 194 29.2 Input For Examples Showing Unique Name Generation for Variables....... 194 29.3 Example Output Showing Unique Variable Names................. 195 29.4 Input For Examples Showing Unique Name Generation for Functions....... 195 29.5 Example Output Showing Unique Function Names................. 195 30 Command-line Processing Within Translators 201 30.1 Commandline Selection of Files............................ 201 31 Tailoring The Code Generation Format 205 31.1 Source Code for Example that Tailors the Code Generation............ 205 31.2 Input to Demonstrate Tailoring the Code Generation................ 205 31.3 Final Code After Tailoring the Code Generation.................. 205 32 AST Construction 209 32.1 Variable Declarations.................................. 209 32.2 Expressions....................................... 213 32.3 Assignment Statements................................ 215 32.4 Functions........................................ 217 32.5 Function Calls..................................... 222 32.6 Creating a 'struct' for Global Variables........................ 222 33 Parser Building Blocks 233 33.1 Grammar Examples.................................. 234 33.2 AstAttribute to Store results............................. 235 33.3 The AstFromString Namespace............................ 236 33.4 Write your parsers using parser building blocks................... 236 33.5 Limitations....................................... 238 34 Handling Comments, Preprocessor Directives, And Adding Arbitrary Text to Generated Code 239 34.1 How to Access Comments and Preprocessor Directives............... 239 34.1.1 Source Code Showing How to Access Comments and Preprocessor Directives240 34.1.2 Input to example showing how to access comments and CPP directives. 240 CONTENTS vii 34.1.3 Comments and CPP Directives collected from source file (skipping headers)240 34.1.4 Comments and CPP Directives collected from source file and all header files240 34.2 Collecting #define C Preprocessor Directives.................... 240 34.2.1 Source Code Showing How to Collect #define Directives.......... 240 34.2.2 Input to example showing how to access comments and CPP directives. 241 34.2.3 Comments and CPP Directives collected from source file and all header files241 34.3 Automated Generation of Comments......................... 241 34.3.1 Source Code Showing Automated Comment Generation.......... 241 34.3.2 Input to Automated Addition of Comments................. 241 34.3.3 Final Code After Automatically Adding Comments............. 241 34.4 Addition of Arbitrary Text to Unparsed Code Generation............. 242 34.4.1 Source Code Showing Automated Arbitrary Text Generation....... 242 34.4.2 Input to Automated Addition of Arbitrary Text.............. 242 34.4.3 Final Code After Automatically Adding Arbitrary Text.......... 242 35 Partial Redundancy Elimination (PRE) 253 35.1 Source Code for example using PRE........................
Recommended publications
  • Source-To-Source Translation and Software Engineering
    Journal of Software Engineering and Applications, 2013, 6, 30-40 http://dx.doi.org/10.4236/jsea.2013.64A005 Published Online April 2013 (http://www.scirp.org/journal/jsea) Source-to-Source Translation and Software Engineering David A. Plaisted Department of Computer Science, University of North Carolina at Chapel Hill, Chapel Hill, USA. Email: [email protected] Received February 5th, 2013; revised March 7th, 2013; accepted March 15th, 2013 Copyright © 2013 David A. Plaisted. This is an open access article distributed under the Creative Commons Attribution License, which permits unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited. ABSTRACT Source-to-source translation of programs from one high level language to another has been shown to be an effective aid to programming in many cases. By the use of this approach, it is sometimes possible to produce software more cheaply and reliably. However, the full potential of this technique has not yet been realized. It is proposed to make source- to-source translation more effective by the use of abstract languages, which are imperative languages with a simple syntax and semantics that facilitate their translation into many different languages. By the use of such abstract lan- guages and by translating only often-used fragments of programs rather than whole programs, the need to avoid writing the same program or algorithm over and over again in different languages can be reduced. It is further proposed that programmers be encouraged to write often-used algorithms and program fragments in such abstract languages. Libraries of such abstract programs and program fragments can then be constructed, and programmers can be encouraged to make use of such libraries by translating their abstract programs into application languages and adding code to join things together when coding in various application languages.
    [Show full text]
  • About ILE C/C++ Compiler Reference
    IBM i 7.3 Programming IBM Rational Development Studio for i ILE C/C++ Compiler Reference IBM SC09-4816-07 Note Before using this information and the product it supports, read the information in “Notices” on page 121. This edition applies to IBM® Rational® Development Studio for i (product number 5770-WDS) and to all subsequent releases and modifications until otherwise indicated in new editions. This version does not run on all reduced instruction set computer (RISC) models nor does it run on CISC models. This document may contain references to Licensed Internal Code. Licensed Internal Code is Machine Code and is licensed to you under the terms of the IBM License Agreement for Machine Code. © Copyright International Business Machines Corporation 1993, 2015. US Government Users Restricted Rights – Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. Contents ILE C/C++ Compiler Reference............................................................................... 1 What is new for IBM i 7.3.............................................................................................................................3 PDF file for ILE C/C++ Compiler Reference.................................................................................................5 About ILE C/C++ Compiler Reference......................................................................................................... 7 Prerequisite and Related Information..................................................................................................
    [Show full text]
  • Compiler Error Messages Considered Unhelpful: the Landscape of Text-Based Programming Error Message Research
    Working Group Report ITiCSE-WGR ’19, July 15–17, 2019, Aberdeen, Scotland Uk Compiler Error Messages Considered Unhelpful: The Landscape of Text-Based Programming Error Message Research Brett A. Becker∗ Paul Denny∗ Raymond Pettit∗ University College Dublin University of Auckland University of Virginia Dublin, Ireland Auckland, New Zealand Charlottesville, Virginia, USA [email protected] [email protected] [email protected] Durell Bouchard Dennis J. Bouvier Brian Harrington Roanoke College Southern Illinois University Edwardsville University of Toronto Scarborough Roanoke, Virgina, USA Edwardsville, Illinois, USA Scarborough, Ontario, Canada [email protected] [email protected] [email protected] Amir Kamil Amey Karkare Chris McDonald University of Michigan Indian Institute of Technology Kanpur University of Western Australia Ann Arbor, Michigan, USA Kanpur, India Perth, Australia [email protected] [email protected] [email protected] Peter-Michael Osera Janice L. Pearce James Prather Grinnell College Berea College Abilene Christian University Grinnell, Iowa, USA Berea, Kentucky, USA Abilene, Texas, USA [email protected] [email protected] [email protected] ABSTRACT of evidence supporting each one (historical, anecdotal, and empiri- Diagnostic messages generated by compilers and interpreters such cal). This work can serve as a starting point for those who wish to as syntax error messages have been researched for over half of a conduct research on compiler error messages, runtime errors, and century. Unfortunately, these messages which include error, warn- warnings. We also make the bibtex file of our 300+ reference corpus ing, and run-time messages, present substantial difficulty and could publicly available.
    [Show full text]
  • Extending Fortran with Meta-Programming
    OpenFortran: Extending Fortran with Meta-programming Songqing Yue and Jeff Gray Department of Computer Science University of Alabama Tuscaloosa, AL, USA {syue, gray}@cs.ua.edu Abstract—Meta-programming has shown much promise for manipulated [1]. MOPs add the ability of meta-programming improving the quality of software by offering programming to programming languages by providing users with standard language techniques to address issues of modularity, reusability, interfaces to modify the internal implementation of the maintainability, and extensibility. A system that supports meta- program. Through the interface, programmers can programming is able to generate or manipulate other programs incrementally change the implementation and the behavior of a to extend their behavior. This paper describes OpenFortran, a program to better suit their needs. Furthermore, a metaprogram Meta-Object Protocol (MOP) that is able to bring the power of can capture the needs of a commonly needed feature and be meta-programming to Fortran, one of the most widely used applied to several different base programs. languages in the area of High Performance Computing (HPC). OpenFortran provides a framework that allows library A MOP may perform the underling adaptation of the base developers to build arbitrary source-to-source program program at either run-time or compile-time. Run-time MOPs transformation libraries for Fortran programs. To relieve the function while a program is executing and can be used to burden of learning the details about how the underlying perform real-time adaptation, for example the Common Lisp transformations are performed, a domain-specific language Object System (CLOS) [13] that allows the mechanisms of named SPOT has been created that allows developers to specify inheritance, method dispatching, and class instantiation to be direct manipulation of programs.
    [Show full text]
  • Towards Large-Scale Refactoring for Ocaml
    Towards Large-scale Refactoring for OCaml REUBEN N. S. ROWE, University of Kent, UK SIMON J. THOMPSON, University of Kent, UK Refactoring is the process of changing the way a program works without changing its overall behaviour. The functional programming paradigm presents its own unique challenges to refactoring. For the OCaml language in particular, the expressiveness of its module system makes this a highly non-trivial task. The use of PPX preprocessors, other language extensions, and idiosyncratic build systems complicates matters further. We begin to address the question of how to refactor large OCaml programs by looking at a particular refactoring—value binding renaming—and implementing a prototype tool to carry it out. Our tool, Rotor, is developed in OCaml itself and combines several features to manage the complexities of refactoring OCaml code. Firstly it defines a rich, hierarchical way of identifying bindings which distinguishes between structures and functors and their associated module types, and is able to refer directly to functor parameters. Secondly it makes use of the recently developed visitors library to perform generic traversals of abstract syntax trees. Lastly it implements a notion of ‘dependency’ between renamings, allowing refactorings to be computed in a modular fashion. We evaluate Rotor using a snapshot of Jane Street’s core library and its dependencies, comprising some 900 source files across 80 libraries, and a test suite of around 3000 renamings. We propose that the notion of dependency is a general one for refactoring, distinct from a refactoring ‘precondition’. Dependencies may actually be mutual, in that all must be applied together for each one individually to be correct, and serve as declarative specifications of refactorings.
    [Show full text]
  • Combining Source and Target Level Cost Analyses for Ocaml Programs
    Combining Source and Target Level Cost Analyses for OCaml Programs Stefan K. Muller Jan Hoffmann Carnegie Mellon University Carnegie Mellon University Abstract bounding gas usage in smart contracts [24]. More generally, Deriving resource bounds for programs is a well-studied it is an appealing idea to provide programmers with imme- problem in the programming languages community. For com- diate feedback about the efficiency of their code at design piled languages, there is a tradeoff in deciding when during time. compilation to perform such a resource analysis. Analyses at When designing a resource analysis for a compiled higher- the level of machine code can precisely bound the wall-clock level language, there is a tension between working on the execution time of programs, but often require manual anno- source code, the target code, or an intermediate represen- tations describing loop bounds and memory access patterns. tation. Advantages of analyzing the source code include Analyses that run on source code can more effectively derive more effective interaction with the programmer and more such information from types and other source-level features, opportunities for automation since the control flow and type but produce abstract bounds that do not directly reflect the information are readily available. The advantage of analyz- execution time of the compiled machine code. ing the target code is that analysis results apply to the code This paper proposes and compares different techniques for that is eventually executed. Many of the tools developed combining source-level and target-level resource analyses in in the programming languages community operate on the the context of the functional programming language OCaml.
    [Show full text]
  • Basic Compiler Algorithms for Parallel Programs *
    Basic Compiler Algorithms for Parallel Programs * Jaejin Lee and David A. Padua Samuel P. Midkiff Department of Computer Science IBM T. J. Watson Research Center University of Illinois P.O.Box 218 Urbana, IL 61801 Yorktown Heights, NY 10598 {j-lee44,padua}@cs.uiuc.edu [email protected] Abstract 1 Introduction Traditional compiler techniques developed for sequential Under the shared memory parallel programming model, all programs do not guarantee the correctness (sequential con- threads in a job can accessa global address space. Communi- sistency) of compiler transformations when applied to par- cation between threads is via reads and writes of shared vari- allel programs. This is because traditional compilers for ables rather than explicit communication operations. Pro- sequential programs do not account for the updates to a cessors may access a shared variable concurrently without shared variable by different threads. We present a con- any fixed ordering of accesses,which leads to data races [5,9] current static single assignment (CSSA) form for parallel and non-deterministic behavior. programs containing cobegin/coend and parallel do con- Data races and synchronization make it impossible to apply structs and post/wait synchronization primitives. Based classical compiler optimization and analysis techniques di- on the CSSA form, we present copy propagation and dead rectly to parallel programs because the classical methods do code elimination techniques. Also, a global value number- not account.for updates to shared variables in threads other ing technique that detects equivalent variables in parallel than the one being analyzed. Classical optimizations may programs is presented. By using global value numbering change the meaning of programs when they are applied to and the CSSA form, we extend classical common subex- shared memory parallel programs [23].
    [Show full text]
  • A Compiler-Compiler for DSL Embedding
    A Compiler-Compiler for DSL Embedding Amir Shaikhha Vojin Jovanovic Christoph Koch EPFL, Switzerland Oracle Labs EPFL, Switzerland {amir.shaikhha}@epfl.ch {vojin.jovanovic}@oracle.com {christoph.koch}@epfl.ch Abstract (EDSLs) [14] in the Scala programming language. DSL devel- In this paper, we present a framework to generate compil- opers define a DSL as a normal library in Scala. This plain ers for embedded domain-specific languages (EDSLs). This Scala implementation can be used for debugging purposes framework provides facilities to automatically generate the without worrying about the performance aspects (handled boilerplate code required for building DSL compilers on top separately by the DSL compiler). of extensible optimizing compilers. We evaluate the practi- Alchemy provides a customizable set of annotations for cality of our framework by demonstrating several use-cases encoding the domain knowledge in the optimizing compila- successfully built with it. tion frameworks. A DSL developer annotates the DSL library, from which Alchemy generates a DSL compiler that is built CCS Concepts • Software and its engineering → Soft- on top of an extensible optimizing compiler. As opposed to ware performance; Compilers; the existing compiler-compilers and language workbenches, Alchemy does not need a new meta-language for defining Keywords Domain-Specific Languages, Compiler-Compiler, a DSL; instead, Alchemy uses the reflection capabilities of Language Embedding Scala to treat the plain Scala code of the DSL library as the language specification. 1 Introduction A compiler expert can customize the behavior of the pre- Everything that happens once can never happen defined set of annotations based on the features provided by again.
    [Show full text]
  • A Bundle of Program Transformation Tools System Description
    ¡ ¢ £ ¤ ¦ ¨ ¨ ! $ % & ! % $ ' ( * * ( + - . / 0 XT: a bundle of program transformation tools system description Merijn de Jonge 1 CWI, Department SEN, PO Box 94079, 1090 GB Amsterdam, The Netherlands Eelco Visser 2 Universiteit Utrecht, Institute of Information and Computing Sciences PO Box 80089, 3508 TB Utrecht, The Netherlands Joost Visser 3 CWI, Department SEN, PO Box 94079, 1090 GB Amsterdam, The Netherlands Abstract XT bundles existing and newly developed program transformation libraries and tools into an open framework that supports component-based development of program transforma- tions. We discuss the roles of XT’s constituents in the development process of program transformation tools, as well as some experiences with building program transformation systems with XT. 1 Introduction Program transformation encompasses a variety of different, but related, language processing scenarios, such as optimization, compilation, normalization, and reno- vation. Across these scenarios, many common, or similar subtasks can be distin- guished, which opens possibilities for software reuse. To support and demonstrate such reuse across program transformation project boundaries, we have developed XT. XT is a bundle of existing and newly developed libraries and tools useful in the 4 Email:[email protected] 5 Email:[email protected] 6 Email:[email protected] 8 : : ; < > @ BC E G H J @ L N BE H P CH R T V CH Y V H [ ] _ ] 7 c 79 a b d f g i b j g a m oq q b s j g a m oq q b s context of program transformation. It bundles its constituents into an open frame- work for component-based transformation tool development, which is flexible and extendible.
    [Show full text]
  • Wind River Diab Compiler
    WIND RIVER DIAB COMPILER Boost application performance, reduce memory footprint, and produce high-quality, standards-compliant object code for embedded systems with Wind River® Diab Compiler. Wind River has a long history of providing software and tools for safety-critical applications requiring certification in the automotive, medical, avionics, and industrial markets. And it’s backed by an award-winning global support organization that draws on more than 25 years of compiler experience and hundreds of millions of successfully deployed devices. TOOLCHAIN COMPONENTS Diab Compiler includes the following programs and utilities: • Driver: Intelligent wrapper program invoking the compiler, assembler, and linker, using a single application • Assembler: Macro assembler invoked automatically by the driver program or as a complete standalone assembler generating object modules – Conditional macro assembler with more than 30 directives – Unlimited number of symbols – Debug information for source-level debugging of assembly programs • Compiler: ANSI/ISO C/C++ compatible cross-compiler – EDG front end – Support for ANSI C89, C99, and C++ 2003 – Hundreds of customizable optimizations for performance and size – Processor architecture–specific optimizations – Whole-program optimization capability • Low-level virtual machine (LLVM)–based technology: Member of the LLVM commu- nity, accelerating inclusion of new innovative compiler features and leveraging the LLVM framework to allow easy inclusion of compiler add-ons to benefit customers • Linker: Precise
    [Show full text]
  • Compilers History Wikipedia History Main Article: History of Compiler
    Compilers History Wikipedia History Main article: History of compiler construction Software for early computers was primarily written in assembly language for many years. Higher level programming languages were not invented until the benefits of being able to reuse software on different kinds of CPUs started to become significantly greater than the cost of writing a compiler. The very limited memory capacity of early computers also created many technical problems when implementing a compiler. Towards the end of the 1950s, machine-independent programming languages were first proposed. Subsequently, several experimental compilers were developed. The first compiler was written by Grace Hopper, in 1952, for the A-0 programming language. The FORTRAN team led by John Backus at IBM is generally credited as having introduced the first complete compiler in 1957. COBOL was an early language to be compiled on multiple architectures, in 1960. In many application domains the idea of using a higher level language quickly caught on. Because of the expanding functionality supported by newer programming languages and the increasing complexity of computer architectures, compilers have become more and more complex. Early compilers were written in assembly language. The first self-hosting compiler — capable of compiling its own source code in a high-level language — was created for Lisp by Tim Hart and Mike Levin at MIT in 1962. Since the 1970s it has become common practice to implement a compiler in the language it compiles, although both Pascal and C have been popular choices for implementation language. Building a self-hosting compiler is a bootstrapping problem—the first such compiler for a language must be compiled either by hand or by a compiler written in a different language, or (as in Hart and Levin's Lisp compiler) compiled by running the compiler in an interpreter.
    [Show full text]
  • Compilers and Compiler Generators
    Compilers and Compiler Generators an introduction with C++ © P.D. Terry, Rhodes University, 1996 [email protected] This is a set of Postcript® files of the text of my book "Compilers and Compiler Generators - an introduction with C++", published in 1997 by International Thomson Computer Press. The original edition is now out of print, and the copyright has reverted to me. The book is also available in other formats. The latest versions of the distribution and details of how to download up-to-date compressed versions of the text and its supporting software and courseware can be found at http://www.scifac.ru.ac.za/compilers/ The text of the book is Copyright © PD Terry. Although you are free to make use of the material for academic purposes, the material may not be redistributed without my knowledge or permission. File List The 18 chapters of the book are filed as chap01.ps through chap18.ps The 4 appendices to the book are filed as appa.ps through appd.ps The original appendix A of the book is filed as appa0.ps The contents of the book is filed as contents.ps The preface of the book is filed as preface.ps An index for the book is filed as index.ps. Currently (January 2000) the page numbers refer to an A4 version in PCL® format available at http://www.scifac.ru.ac.za/compilers/longpcl.zip. However, software tools like GhostView may be used to search the files for specific text. The bibliography for the book is filed as biblio.ps Change List 18-October-1999 - Pre-release 12-November-1999 - First official on-line release 16-January-2000 - First release of Postscript version (incorporates minor corrections to chapter 12) Compilers and Compiler Generators © P.D.
    [Show full text]