Pascal - Syntax in BNF Notation

BNF (Backus Naur Form).


pascal-program: 
   program identifier program-headingopt ; block . 


program-heading:  
   ( identifier-list ) 


identifier-list: 
   identifier  
   identifier-list , identifier  


block:  
   block1  
   label-declaration ; block1  


block1:  
   block2  
   constant-declaration ; block2  


block2:  
   block3  
   type-declaration ; block3  


block3:  
   block4  
   variable-declaration ; block4  


block4:  
   block5  
   proc-and-func-declaration ; block5  


block5:  
   begin statement-list end  


label-declaration:  
   label unsigned-integer  
   label-declaration , unsigned-integer  


constant-declaration:  
   const  identifier = constant  
   constant-declaration ;  identifier = constant  


type-declaration:  
   type  identifier = type  
   type-declaration ;  identifier = type  


variable-declaration:  
   var variableid-list : type  
   variable-declaration ; variableid-list : type  


variableid-list:  
   identifier  
   variableid-list ,  identifier  


constant:  
   integer  
   real 
   string
   constid  
   + constid 
   TADD- constid 


type:  
   simple-type  
   structured-type  
   ^ typeid  


simple-type:  
   (  identifier-list )  
   constant ... constant  
   typeid  


structured-type:  
   array [ index-list ] of type  
   record field-list end  
   set of simple-type  
   file of type  
   packed structured-type  


index-list:  
   simple-type  
   index-list , simple-type  


field-list:  
   fixed-part  
   fixed-part ; variant-part 
   variant-part 


fixed-part:  
   record-field 
   fixed-part ; record-field 


record-field: 
   empty 
   fieldid-list : type   


fieldid-list:  
   identifier  
   fieldid-list ,  identifier  


variant-part: 
   case tag-field of variant-list 


tag-field: 
   typeid  
   identifier : typeid  


variant-list:  
   variant 
   variant-list ; variant 


variant: 
   empty 
   case-label-list : ( field-list )  


case-label-list:  
   constant  
   case-label-list , constant  


proc-and-func-declaration:  
   proc-or-func  
   proc-and-func-declaration ; proc-or-func 


proc-or-func:  
   procedure  identifier parametersopt ;  block-or-forward 
   function  identifier parametersopt : typeid ; block-or-forward 


block-or-forward:  
   block  
   forward  


parameters:  
   ( formal-parameter-list )  


formal-parameter-list:  
   formal-parameter-section  
   formal-parameter-list ; formal-parameter-section  


formal-parameter-section:  
   parameterid-list : typeid 
   var parameterid-list : typeid  
   procedure identifier parametersopt 
   function identifier parametersopt : typeid 


parameterid-list:  
   identifier  
   parameterid-list , identifier  


statement-list:  
   statement  
   statement-list ; statement  


statement:  
   empty  
   variable := expression  
   begin statement-list end  
   if expression then statement 
   if expression then statement else statement  
   case expression of case-list end  
   while expression do statement  
   repeat statement-list until expression  
   for varid := for-list do statement  
   procid  
   procid ( expression-list )  
   goto label 
   with record-variable-list do statement  
   label : statement  


variable:  
   identifier  
   variable [ subscript-list ]  
   variable . fieldid  
   variable ^  


subscript-list:  
   expression  
   subscript-list , expression  


case-list:  
   case-label-list : statement  
   case-list ; case-label-list : statement  


for-list:  
   expression to expression  
   expression downto expression  


expression-list:  
   expression  
   expression-list , expression  


label:  
   unsigned-integer 


record-variable-list:  
   variable  
   record-variable-list , variable  


expression: 
   expression relational-op additive-expression 
   additive-expression  


relational-op: one of 
   <  <=  =  <>  =>  > 


additive-expression: 
   additive-expression additive-op multiplicative-expression 
   multiplicative-expression  


additive-op: one of 
   +  -  or 


multiplicative-expression: 
   multiplicative-expression multiplicative-op unary-expression 
   unary-expression  


multiplicative-op: one of 
   *  /  div  mod  and  in 


unary-expression: 
   unary-op unary-expression  
   primary-expression  


unary-op:  one of 
   +  -  not 


primary-expression:  
   variable  
   unsigned-integer  
   unsigned-real  
   string  
   nil  
   funcid ( expression-list )  
   [ element-list ]  
   ( expression )  


element-list:  
   empty  
   element  
   element-list , element  


element:  
   expression  
   expression ... expression  


constid:  
   identifier  


typeid:  
   identifier  


funcid: 
   identifier  


procid:  
   identifier  


fieldid:  
   identifier   

  
varid: 
   identifier  


empty: