Dear Chris, 

it is a typical Benchmark problem that some relevant topics are not compared. The aim of Tp2cp is not to get a immediately running program after translation. It has the 80 to 20 approach: Get 80% translated with 20% effort.

The most important topic is comments inside programs. Tp2cp passes all comments from the source to the translated result.

What does P20 do with comments? 

The second important topic is the name translations and adding subsystem names. Suppose you have to translate a bigger project with a lot of Units (MODULEs) and you would like to have the result into the same subsystem. We implement name translations and adding the subsystem names.

E.g. the symbol table have the following entries: 

        .DynLib                                  C2pasStrings 
        DynLib.DynString 

        .Keytab                                  C2pasKeytab 
        Keytab.Keyword                       GetKeyword 

then we translate with Tp2cp the source 

        FUNCTION GetIdentifier* (index: INTEGER): DynString; 
        BEGIN 
                GetIdentifier := Keyword(symtable[index].identifier) 
        END GetIdentifier; 

to 

        PROCEDURE GetIdentifier* (index: INTEGER): C2cpStrings.DynString; 
        BEGIN 
                RETURN C2cpKeytab.GetKeyword(symtable[index].identifier) 
        END GetIdentifier; 

Have P20 a name translations? 

That was very helpfully at my project to translate C2cp from Turbo Pascal to Component Pascal. After I solved the topic of the different string handling between TP (starts with index 1 index 0 = length of string) und CP (starts with index 0 end ends with 0X) the program was running.

We separate the translation from (Turbo) Pascal to Component Pascal into 4 different modules: 

        1. Translation from TP to CP with Tp2cp and using name translation via symbol table. 
        2. Beautify the result with CpcBeautifier and if necessary type translations (see options) 
        3. Translation of enumerated types with CpcPreprocessor 
        4. Translate the characters to Unicode TboxAutoCharEdit (not published yet) 

An other topic is the character translations. Old Turbo Pascal uses the IBM-PC extended ASCII character set. I can translate this character set with module 4 to Unicode but the result is not working. See my last email via Black Box Mailing list.

Have P20 a character translations? 

Regards 

Helmut Zinn 

-----Ursprüngliche Nachricht----- 
Von: blackbox@oberon.ch [mailto:blackbox@oberon.ch]Im Auftrag von CFB 
Software 
Gesendet: Mittwoch, 19. Oktober 2005 05:48 
An: BlackBox Mailing List 
Betreff: [BlackBox] - Pascal to Component Pascal translator 

>         Sounds good.  How does it differ from Tp2Cp? 

Gérard Meunier (the author of Tp2Cp) asked exactly the same question on 
the GPCP mailing list. My response was: 

The end results are very similar for the Pascal programs that I have 
tested with both translators. Yours (Tp2Cp) does more to handle 
Turbo-related code. The following example (unashamedly contrived to show 
my (P2O) best points!) illustrates the major differences: 

Original Pascal Source: 
======================= 

program test; 

type 
  enum = (first, middle, last); 
  subrange = 0..10; 
  rec = record 
  i: integer; 
  j: integer 
end; 

var 
  j, k: integer; 
  r: rec; 

begin 
  with r do begin 
    i := j; 
    j := k 
  end; 

if j = 0 then 
  j := 1 
else if j = 1 then 
  j := 0; 
end. 

Tp2Cp Translation 
================= 

MODULE test; 

TYPE 
  enum = (first, middle, last); 
  subrange = 0..10; 
  rec = RECORD 
    i: INTEGER; 
    j: INTEGER 
  END; 
  
VAR 
  j, k: INTEGER; 
  r: rec; 

PROCEDURE Main*; 
BEGIN 
  WITH r DO 
    i := j; 
    j := k 
  END; 
  
  IF j = 0 THEN 
    j := 1 
  ELSE IF j = 1 THEN 
    j := 0 END END; 
END Main; 
END test. 

P2O Translation 
=============== 

MODULE test; 

TYPE 
  enum = INTEGER; 
CONST first = 0; middle = 1; last = 2; 
  subrange = INTEGER; 
  rec = RECORD 
    i: INTEGER; 
    j: INTEGER 
  END; 
  
VAR 
  j, k: INTEGER; 
  r: rec; 

BEGIN 
  (* WITH  r DO *) 
    
    r.i :=  r.j; 
    
    r.j := k 
  (* END WITH *); 
  
  IF j = 0 THEN 
    j := 1 
  ELSIF j = 1 THEN 
    j := 0 
  END; 
END test. 

============= 

Note1: WITH handling is currently only working for the simplest cases. 

Note2: The CONST statements generated from enumerated types need to be 
relocated above the TYPE section before attempting to compile the 
translated code. 

Chris Burrows 
CFB Software 
http://www.cfbsoftware.com/gpcp 

--- BlackBox 
--- send subject HELP or UNSUBSCRIBE to blackbox@oberon.ch