summaryrefslogtreecommitdiff
path: root/misc/pascal/doc/PascalNotes.txt
blob: dc7ca8df4a79c45fd3ecc516a5f1d710e8cbf59b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
                          AS OF 1/18/04

TYPES
- Only types INT, BOOLEAN, CHAR, REAL, SCALAR, SUBRANGE, RECORD and SET
  implemented
  - No PACKED types (actually, types are always packed).
  - FILE OF and TEXT types partially supported
    - Not supported in TYPE block
    - TEXT is defined as FILE OF CHAR vs PACKED FILE OF CHAR
    - No function returning FILE OF; No FILE OF
      procedure/function arguments
    - Only PROGRAM arguments can be declared type FILE OF
    - Only one file identifier per FILE OF declaration in type
      block.
  - SET is limit to 16/32 (# bits in int) adjacent elements
  - Expressions are not strongly typed across different SCALAR types
    (see exprEnum in expr.h)
  - In RECORD CASE, there is no verification that the type of the tag
    is consistent with a case selector; the is check if the case selector
    constants are of the same type as the tag type identifier.

- No range checks on array indices
- Pointers
  - Can't pass pointers as VAR parameters
  - No pointer functions ??
  - No pointers to pointers

STATEMENTS
- The following statements not implemented:
    - No PROCEDURE call with PROCEDUREs or FUNCTIONs as parameters
- The following statements are only partially implemented
    - WITH statements cannot be nested.
    - Cannot reference "up the chain" in WITH statements.  Eg.
      suppose RECORD "a" contains RECORD "b" which contains "c" and
      that RECORD "a" also contains "d" so that we could write
        a.b.c OR a.d
      Then the following should work but is not yet supported:
      WITH a DO
        BEGIN
          WITH b DO
            BEGIN
              c := ..
              d := .. <== SHOULD WORK!!!
    - GOTO only partially implemented -- no stack corrections
      for GOTOs between loops, blocks, etc.  Use is DANGEROUS.

STANDARD PROCEDURES and FUNCTIONS
- The following statement procedures/functions not implemented:
    - GET, PUT, PACK, UNPACK, NEW
    - TBD
- No fieldwidth colon operator on WRITE arguments

Extended Pascal Features
- Type STRING is partially implemented.
- PACKED ARRAY[..] OF CHAR is not a a string.

NON-standard Pascal extensions/differences

TYPES
- ARRAY index type is integer constant specifying size of array
- Hexadecimal constants.
- INPUT and OUTPUT parameters in PROGRAM statement are
  predeclared and optional.

OPERATORS
- Binary shift operators -- << and >> like in C
- '#', "<>", and "><" are all equivalent

COMPILER PSEUDO-OPERATIONS
- INCLUDE

STATEMENTS
- CASE statement expects integer expression for the switch
  variable
- ELSE in CASE statement

EXPRESSIONS

- Assumes sizeof(pointer) == sizeof(integer)

TODO LIST

o BUGS
- Implement PUT and GET.
- In FUNC/PROC calls, if simpleExpression fails to find a parameter (eg.,
  proc (,,), no error is detected.
- Type FILE OF is totally busted -- fix it
- Need to get max string size into stack somehow.  Runtime routines like
  strcat and strcatc need to know how big the string storage space is.
- Need logic to release string stack used by actual parameters after
  function/procedure call.
- Can't declare new parameters / variables with same name as another
  variable at higher stock.  Tokenizer does not return tIDENT.
- There are lots of cases where the string stack is not being managed
  correctly (e.g., usesSection()).
- Redirection of input and output is not supported (e.g. see setting of
  input and output in CONST section of pageutils.pas).

o IMPROVEMENTS
- In PTKN, verify that string stack does not overflow when
  character added.
- Option to turn on listing
- Option to interleave assembly language with listing
- Option to select string stack size (or let it grow dynamically)
- Option to select symbol table size (or let it grow dynamically)
- List file should only be produced if option provided.
- Provide instrumentation to use the line number data in the
  object files.  In debugger, display source line.  Allow stepping
  from source line to source line.
- Optimizer needs to be incorporated into compiler.
- arrayIndex needs to conform with Pascal standard.
- Need to have 32-bit integers and address
- Translation to register model
- Native code translator
- Linker and support multiple source files
- Runtime package
- Full extended pascal string support
- Other things from extended pascal:  'list of' 'uses' 'unit'
- Need to optimize out JMP .+1
- For compatibility, let  'packed array [n..m] of char;' be equivalent to
  string.
- Need to review all uses of string stack for identifiers and strings
  that get discarded.  Probably should get a get infrastructure.
- Add 16-bit word type

o ISSUES
- What happens in TYPE block if type is sTYPE or sFILE_OF?  Need
  to re-think all typing.  Maybe replace sTYPE and sFILE_OF with
  sINT_TYPE, sINT_ARRAY_TYPE, ..., sFILE_OF_INT,
  sFILE_OF_INT_ARRAY, etc.
- Is it really necessary or meaningful to allocate dstack for
  file buffers.
- Revisit procedure call logic in pexec.c & pdbg.c.  First stack parameter
  is calculated but never used.
- Decide what to do about type filename in tests/src/cgimail.pas