DataMuseum.dk

Presents historical artifacts from the history of:

Bogika Butler

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Bogika Butler

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦eee47c30d⟧ TextFile

    Length: 19712 (0x4d00)
    Types: TextFile
    Names: »EOSP.OV1«

Derivation

└─⟦61d7681d7⟧ Bits:30009789/_.ft.Ibm2.50006629.imd Mogens Pelles Zilog 80,000 / EOS projekt
    └─⟦this⟧ »EOSP.OV1« 

TextFile

^U1. Indledning.^u

     Formålet med dette skrift er at give læseren en bedre
oversigt over EosPascal end man får ved læsning af Erik Reehs
EosPascal-manual. Endvidere indeholder skriftet en del
kommentarer til og uddybninger af forskellige EosPascal-faciliteter.
     I afsnit 2 gengives den komplette syntaks for EosPascal, og i
afsnit 3 gøres der rede for virkefeltsreglerne. Endelig indeholder
afsnit 4 kommentarer og uddybninger.


^U2. Syntaks for EosPascal.^u

     Nedenstående syntaksbeskrivelse for EosPascal er fremkommet
ved sammenskrivning af de syntaksregler, der findes i ISO-standarden
for Pascal og i Erik Reehs EosPascal-manual. Dog er syntaksreglerne
for "conformant array parameters" udeladt, da denne konstruktion
$#liste 48
$#punkt -
er en tilføjelse til Pascal, som er gjort under standardiseringsarbejdet,
$#punkt -
er valgfri (man kan undlade at implementere den, og alligevel
hævde, at oversætteren accepterer standard-Pascal).
$#punkt -
er uinteressant for os, da den overlapper kraftigt med EosPascals
"adaptable arrays".
$#liste0

     Endvidere er alt om filer og standard-I/O udeladt, da vi har
aftalt ikke at medtage dette i EosPascal-oversætteren. Endelig er
procedurer og funktioner som parametre udeladt. De bruges (så vidt
jeg ved) ikke i Eos-teksterne, og så slipper jeg da for at implementere
^Udet^u.
     Syntaksreglerne er skrevet på den måde, der bruges i
Pascal-standarden (for at gøre det lettere for mig at skrive af).
Bemærk, at Erik Reeh har brugt en notation, der afviger lidt.
Der er også lidt forskel i den "stil", der bruges de to steder. Dette
har gjort det nødvendigt at foretage mindre ændringer i syntaksreglerne
(både standard-Pascal-reglerne og EosPascal-reglerne). Disse ændringer
er ^Uikke^u afmærkede på nogen måde.
     Dele af syntaksregler, der stammer fra EosPascal-manualen,
er understregede. Hvis en hel syntaksregel stammer fra EosPascal-manualen,
er dog kun nonterminalens navn understreget. På denne måde kan man
også se, hvilke nonterminaler, der er særegne for EosPascal.
     Ind i mellem vil man finde kommentarer til syntaksreglerne.
Disse kommentarer er på engelsk,
da der bruges visse engelske specialtegn i syntaksreglerne, og
det er besværligt hele tiden at skifte mellem dansk og amerikansk
tegnsæt på skriveren.
$#kopier
▶1b◀R


-- The following is Standard-Pascal, but probably should be
left out (!)

program = program-heading ";" program-block "." .
program-heading = "program" identifier
                  Æ "(" program-parameters ")" Å .
program-parameters = identifier-list .
program-block = block .


-- The following is the corresponding EosPascal syntax:

^UEosPascal-program^u = "object" "program" identifier ";"
                    æ constant-definition-part
                    ø type-definition-part
                    ø procedure-and-function-declaration-part
                    ø object-type-definition
                    ø program-segment-definition
                    ø program-segment-selection
                    ø object-implementation
                    å
                    installation-part
                    "end" "." .

block = label-declaration-part
        constant-definition-part
        type-definition-part
        variable-declaration-part
        procedure-and-function-declaration-part
        statement-part .

-- Note that declarations come in a fixed order; e.g. no
   variable declarations after a procedure declaration.
   I am not sure that this is required in EosPascal. It
   certainly is not required in the list of declarations
   that constitute an EosPascal-program or an object
   implementation (but of course these are not blocks...)

label-declaration-part =    Æ "label" label
                              æ "," label å ";" Å .

constant-definition-part =  Æ "const" constant-definition ";"
                              æ constant-definition ";" å Å .

type-definition-part =      Æ "type" type-definition ";"
                              æ type-definition ";" å Å .

variable-declaration-part = Æ "var" variable-declaration ";"
                              æ variable-declaration ";" å Å .

procedure-and-function-declaration-part =
                            æ ( procedure-declaration
                              ø function-declaration ) ";" å .

statement-part = compound-statement .


constant-definition = identifier "=" constant .
constant = Æ sign Å (unsigned-number ø constant-identifier)
         ø character-string .
constant-identifier = identifier .

-- General note: Occurrences of identifiers may be of two
   kinds: Defining occurrences and applied occurrences.
   In the syntax, the nonterminal "identifier" is used for
   defining occurrences of identifiers. In applied
   occurrences, nonterminals like "constant-identifier",
   "variable-identifier" etc. are used.

type-definition = identifier "=" type-denoter .
type-denoter = type-identifier ø new-type .
new-type = new-ordinal-type
         ø new-array-type
         ø new-record-type
         ø new-set-type
         ^Uø new-adaptable-type^u
         ø new-pointer-type
         ^Uø new-kernel-pointer-type^u .

simple-type-identifier = type-identifier .
array-type-identifier = type-identifier .
record-type-identifier = type-identifier .
set-type-identifier = type-identifier .
^Uadaptable-type-identifier^u = type-identifier .
pointer-type-identifier = type-identifier .
^Ukernel-pointer-type-identifier^u = type-identifier .
type-identifier = identifier .

simple-type = ordinal-type ø real-type-identifier .
ordinal-type = new-ordinal-type ø ordinal-type-identifier .
new-ordinal-type = enumerated-type ø subrange-type .
ordinal-type-identifier = type-identifier .
real-type-identifier = type-identifier .

-- And then there are the "required identifiers": ^Kreal^k,
   ^Kinteger^k, ^Kboolean^k, ^Kchar^k.

enumerated-type = "(" identifier-list ")" .
identifier-list = identifier æ "," identifier å .

subrange-type = constant ".." constant .

-- Note to "packed" types below:
   Since the EosPascal compiler is built upon the Pascal-P
   compiler (in the last end), and the Pascal-P compiler
   accepts the keyword "packed", but discards it, I think
   that "packed" in EosPascal has no effect. This is in
   contrast to standard Pascal, where it affects parameter
   passing to procedures (and others), even if no packing
   actually takes place.

array-type = new-array-type ø array-type-identifier .
new-array-type = Æ "packed" Å unpacked-array-type .
unpacked-array-type = "array" "Æ" index-type æ
                                  "," index-type å "Å"
                      "of" component-type .
index-type = ordinal-type .
component-type = type-denoter .

record-type = new-record-type ø record-type-identifier .
new-record-type = Æ "packed" Å unpacked-record-type .
unpacked-record-type = "record" field-list "end" .
field-list = Æ ( fixed-part Æ ";" variant-part Å
               ø variant-part
               ) Æ ";" Å
             Å .
fixed-part = record-section æ ";" record-section å .
record-section = identifier-list ":" type-denoter .
variant-part = "case" variant-selector "of" variant
                                       æ ";" variant å .
variant-selector = Æ tag-field ":" Å tag-type .
tag-field = identifier .
variant = case-constant-list ":" "(" field-list ")" .
tag-type = ordinal-type-identifier .
case-constant-list = case-constant æ "," case-constant å .
case-constant = constant .

set-type = new-set-type ø set-type-identifier .
new-set-type = Æ "packed" Å unpacked-set-type .
unpacked-set-type = "set" "of" base-type .
base-type = ordinal-type .

^Uadaptable-type^u = new-adaptable-type ø adaptable-type-identifier .
^Unew-adaptable-type^u = "^^" adaptable-target .
^Uadaptable-target^u = "Æ" "Å" target-array-type-identifier .
^Utarget-array-type-identifier^u = array-type-identifier .

pointer-type = new-pointer-type ø pointer-type-identifier .
new-pointer-type = "^^" domain-type .
domain-type = type-identifier .

^Ukernel-pointer-type^u = new-kernel-pointer-type
                    ø kernel-pointer-type-identifier .
^Unew-kernel-pointer-type^u = "^^^^" target .
^Utarget^u = object-type-identifier
       ø type-identifier
       ø segment-identifier
       ø adaptable-target
       ø empty .
^Uempty^u = .

-- Note that type-^Uidentifiers^u and not type-^Udenoters^u
   are possible domain-types and targets.
   Note also that object-type-identifiers are ^Unot^u
   type-identifiers, since object types are not types
   (foolish name clash!)

variable-declaration = identifier-list ":" type-denoter .

variable-access = entire-variable
                ø component-variable
                ø identified-variable
                ^Uø target-variable^u
                ^Uø typed-variable^u .

entire-variable = variable-identifier .
variable-identifier = identifier .

component-variable = indexed-variable ø field-designator .

indexed-variable = array-component
                 ^Uø adaptable-array-component^u .

array-component = array-variable "Æ" index-expression
                               æ "," index-expression å "Å" .
array-variable = variable-access .
^Uadaptable-array-component^u =
                  adaptable-array "Æ" index-expression
                               æ "," index-expression å "Å" .
^Uadaptable-array^u = adaptable-array-variable
                ø array slice .
^Uadaptable-array-variable^u = variable-access .
^Uarray-slice^u = array-variable "Æ" æ index-expression "," å
                                 range "Å"
            ø adaptable-array "Æ" æ index-expression "," å
                                  range "Å"
^Urange^u = index-expression ".." index-expression .
index-expression = expression .

field-designator = record-variable "." field-specifier
                 ø field-designator-identifier .
record-variable = variable-access .
field-specifier = field-identifier .
field-identifier = identifier .

identified-variable = pointer-variable "^^" .
pointer-variable = variable-access .

^Utarget-variable^u = kernel-pointer-variable "^^^^" .
^Ukernel-pointer-variable^u = variable-access .

^Utyped-variable^u = variable-access ":" type-identifier .


procedure-declaration = procedure-heading ";" directive
                      ø procedure-identification ";"
                        procedure-block
                      ø procedure-heading ";" procedure-block .
procedure-heading = "procedure" identifier
                    Æ formal-parameter-list Å .
procedure-identification = "procedure" procedure-identifier .
procedure-identifier = identifier .
procedure-block = block .

directive = "forward" .

-- And possibly also "external".

$#ny-side
function-declaration = function-heading ";" directive
                     ø function-identification ";"
                       function-block
                     ø function-heading ";" function-block .
function-heading = "function" identifier
                   Æ formal-parameter-list Å ":" result-type.
function-identification = "function" function-identifier .
function-identifier = identifier .
result-type = simple-type-identifier ø pointer-type-identifier .
function-block = block .

formal-parameter-list = "(" formal-parameter-section
                        æ ";" formal-parameter-section å ")" .

formal-parameter-section = value-parameter-specification
                         ø variable-parameter-specification
                         ^Uø universal-parameter-specification^u .

-- Procedural and functional parameters have been left out.

value-parameter-specification = parameter-group .
variable-parameter-specification = "var" parameter-group .
^Uuniversal-parameter-specification^u = "univ" parameter-group
                                  ø "univ" "var" parameter-group .
parameter-group = identifier-list ":" type-identifier .


^Uentry-definition^u = entry-head external-name ";" .
^Uentry-implementation^u = entry-head
                       "with" temporary-kernel-pointers ";"
                       block ";" .
^Uentry-head^u = entry-kind identifier entry-argument-part .
^Uentry-kind^u = "entry" ø "private" ø "otherwise" .
^Uexternal-name^u = character-string .

-- In the EosPascal program that we have got, "external-names"
   are not actually used in entry-definitions and object-type-
   definitions (below). They are used ^Uonly^u in installation-
   parts (also below) !

^Uentry-argument-part^u = Æ "(" entry-arguments
                            æ ";" entry-arguments å ")" Å
^Uentry-arguments^u = direction identifier-list ":" type-identifier .
^Udirection^u = empty ø "in" ø "out" ø "in" "out" .

^Utemporary-kernel-pointers^u = kernel-pointer-record-type .
^Ukernel-pointer-record-type^u = record-type .


^Uobject-type-definition^u = "object" identifier external-name ";"
                         æ constant-definition-part
                         ø type-definition-part
                         ø entry-definition
                         ø object-type-definition
                         å
                         "end" ";" .

-- The last line is an amendment (and hopefully a correction)
   to the EosPascal manual.

^Uidentifier^u > qualified-identifier .
^Uqualified-identifier^u = qualifier "." identifier .
^Uqualifier^u = object-type-identifier .
^Uobject-type-identifier^u = identifier .

-- The ">" replacing a "=" in the definition of "identifier"
   means that this is not the only definition of that
   nonterminal. It corresponds to the "::+" used by Erik Reeh.

^Uobject-implementation^u = "program" identifier "object" implemented
                        "with" local-kernel-pointers
                          æ constant-definition-part
                          ø type-definition-part
                          ø entry-definition
                          ø entry-implementation
                          ø procedure-and-function-declaration-part
                          ø program-segment-definition
                          ø program-segment-selection
                          æ
                        "end" ";" .
^Uimplemented^u = object-type-identifier .
^Ulocal-kernel-pointers^u = kernel-pointer-record-type .


^Uprogram-segment-definition^u = "seg" identifier variable-part ";" .
^Uvariable-part^u = Æ "with" type-denoter Å .

^Uprogram-segment-selection^u = "seg" segment-identifier ":" .
^Usegment-identifier^u = identifier .


^Uinstallation-part^u = Æ "initialize" implementation-identifier
                       external-name ":"
                       local-kernel-pointer-initialization
                       æ "," local-kernel-pointer-initialization å
                    Å
^Ulocal-kernel-pointer-initialization^u = field-identifier
                                      Æ external-name Å
^Ufield-identifier^u = identifier .


expression = simple-expression
             Æ relational-operator simple-expression Å
simple-expression = Æ sign Å term æ adding-operator term å .
term = factor æ multiplying-operator factor å .
factor = variable-access
       ø unsigned-constant
       ø function-designator
       ø set-constructor
       ø "(" expression ")"
       ø "not" factor
       ^Uø array-slice^u
       ^Uø entry-number^u
       ^Uø object-call^u .

unsigned-constant = unsigned-number
                  ø character-string
                  ø constant-identifier
                  ø "nil" .

set-constructor = "Æ" Æ member-designator
                        æ "," member-designator å Å "Å" .
member-designator = expression Æ ".." expression Å .

^Uentry-number^u = entry-identifier .
^Uentry-identifier^u = identifier .

^Uobject-call^u = entry Æ "(" reference-arguments value-arguments ")" Å
^Uentry^u = kernel-pointer-variable "." ( entry-identifier
                                    ø expression ) .
^Ureference-arguments^u = Æ reference-argument
                        æ "," reference-argument å Å .
^Ureference-argument^u = direction expression
                   ø subsegment-argument
                   ø "while" Boolean-expression "do"
                       "(" reference-argument
                           æ "," reference-argument å ")" .
^Usubsegment-argument^u = "var" use expression .
^Uuse^u = Æ "program" Å direction .
^Uvalue-arguments^u = Æ ";" value-argument æ "," value-argument å Å .
^Uvalue-argument^u = direction expression
               ø "while" Boolean-expression "do"
                   "(" value-argument æ "," value-argument å ")" .


multiplying-operator = "*" ø "/" ø "div" ø "mod" ø "and" .
adding-operator = "+" ø "-" ø "or" .
relational-operator = "=" ø "<>" ø "<" ø ">" ø "<=" ø ">=" ø "in" .

function-designator = function-identifier
                      Æ actual-parameter-list Å .
actual-parameter-list = "(" actual-parameter
                        æ "," actual-parameter å ")" .
actual-parameter = expression ø variable-access .


Boolean-expression = expression .

statement = Æ label ":" Å ( simple-statement
                          ø structured-statement ) .
simple-statement = empty-statement
                 ø assignment-statement
                 ø procedure-statement
                 ø goto-statement .

empty-statement = .
assignment-statement = ( variable-access ø function-identifier )
                       ":=" expression .
procedure-statement = procedure-identifier
                      Æ actual-parameter-list Å .

-- The special kinds of parameter lists to the I/O procedures
   "read", "readln", "write" and "writeln" have been omitted.

goto-statement = "goto" label .

structured-statement = compound-statement
                     ø conditional-statement
                     ø repetitive-statement
                     ø with-statement
                     ^Uø exception-statement^u .
statement-sequence = statement æ ";" statement å .

compound-statement = "begin" statement-sequence "end" .

conditional-statement = if-statement ø case-statement .

if-statement = "if" Boolean-expression "then" statement
               Æ else-part Å .
else-part = "else" statement .

$#ny-side
case-statement = "case" case-index "of" case-list-element
                 æ ";" case-list-element å Æ ";" Å "end" .
case-list-element = case-constant-list ":" statement .
case-index = expression .

repetitive-statement = repeat-statement
                     ø while-statement
                     ø for-statement .

repeat-statement = "repeat" statement-sequence
                   "until" Boolean-expression .

while-statement = "while" Boolean-expression "do" statement .

for-statement = "for" control-variable ":=" initial-value
                ( "to" ø "downto" ) final-value "do" statement .
control-variable = entire-variable .
initial-value = expression .
final-value = expression .

with-statement = "with" with-list "do" statement .
with-list = with-element æ "," with-element å .
with-element = record-variable
             ^Uø synonym-element^u
             ^Uø mapping-element^u .
^Usynonym-element^u = identifier "=" variable-access
                ø identifier "=" array-slice .
^Umapping-element^u = record-variable
                ø synonym-element .
field-designator-identifier = identifier.

^Uexception-statement^u = "in" statement-sequence "do" statement .
▶1b◀R▶04◀
$#formatter ny-side
«eof»