%| | FORTRAN.BNF | | Parser for FORVER version 2.6 |% addop = "+" | "-" % adding operators %. mulop = "*" | "/" % multiplying operators %. relop = "<" | "<=" | "==" | "=/=" | ">=" | ">" % relational operators %. sign = "+" | "-" % signs %. simple_type = integer | real | complex | logical. constant = integer_constant | real_constant | boolean_constant | double_constant | string_constant | hollerith_constant | label_constant. char_string = string_constant | hollerith_constant. integer_item = identifier | integer_constant. id = identifier | array_identifier. idx = identifier | array_identifier | function_identifier | intrinsic_identifier. except = identifier | array_identifier | end. % now the productions for the FORTRAN grammar % % start symbol: f10_program % f10_program -> [ line ] end_file . line -> end_line @ % null statement % | integer_constant statement end_line @ % labeled statement % | statement end_line @ % unlabeled statement %. statement -> assignment_statement | control_statement | io_statement | file_control_statement | format_statement | definition_statement | data_statement | namelist_statement | device_control_statement. definition_statement -> PROGRAM' identifier' | INCLUDE char_string | END | DIMENSION idx' <- identifier index_spec [ "," idx' <- identifier index_spec ] | IMPLICIT type_id "(" letter_list ")" [ "," type_id "(" letter_list ")" ] | COMMON ( "/" idx "/" common_spec [ "/" idx "/" common_spec ] | nil common_spec ) | EQUIVALENCE "(" index_use ")" [ "," "(" index_use ")" ] | EXTERNAL identifier' [ "," identifier' ] | PARAMETER identifier' "=" (sign|nil) constant' [ "," identifier' "=" (sign|nil) constant' ] | type_id ( FUNCTION' identifier' ( "(" dummies ")" | nil ) | nil idx' index_spec [ "," idx' index_spec ] ) | FUNCTION' nil' identifier' ( "(" dummies ")" | nil ) | SUBROUTINE' identifier' ( "(" dummies ")" | nil ) | ENTRY' identifier' ( "(" dummies ")" | nil ) | BLOCK' DATA ( identifier' | nil' ) . data_statement -> DATA data_list "/" data_constant_list "/" [ "," data_list "/" data_constant_list "/" ]. assignment_statement -> local_indexed_identifier "=" expression | ASSIGN integer_constant' TO id' . control_statement -> (GO TO | GOTO) ( integer_constant | "(" integer_list ")" ("," | nil) expression | identifier "," "(" integer_list ")" ) | IF "(" expression ")" ( integer_constant "," integer_constant ( "," integer_constant | nil ) | statement ) | DO integer_constant identifier "=" expression "," expression ( "," expression | nil ) | CONTINUE | STOP ( integer_constant | char_string | nil ) | PAUSE ( integer_constant | char_string | nil ) | RETURN ( integer_constant | nil ) | CALL identifier' [ identifier ] ( "(" # ( argument_list | nil ) ")" | nil # ) . io_statement -> READ "(" io_unit conditions ")" io_list | WRITE "(" io_unit conditions ")" io_list | PRINT format_spec io_list | PUNCH format_spec io_list | TYPE format_spec io_list | ACCEPT format_spec io_list | REREAD format_spec io_list | ENCODE "(" encode_decode_spec ")" io_list | DECODE "(" encode_decode_spec ")" io_list | FIND "(" io_unit ")". namelist_statement -> NAMELIST "/" identifier "/" index_use [ "/" identifier "/" index_use ]. file_control_statement -> OPEN "(" [ -end_line ] | CLOSE "(" [ -end_line ]. format_statement -> FORMAT "(" [ -end_line ]. device_control_statement -> REWIND integer_item | UNLOAD integer_item | BACKSPACE integer_item | ENDf FILE integer_item % endf <> end! beware % | SKIP ( RECORD integer_item | FILE integer_item ) | BACKFILE integer_item. % productions used by statements eg. expression % index_spec -> "(" <- array_identifier one_index [ "," one_index ] ")" | nil . one_index -> integer_item ((":" | "/") integer_item | nil). common_spec -> idx' index_spec [ "," idx' index_spec ]. index_use -> idx' ( "(" integer_list ")" | nil ) [ "," idx' ( "(" integer_list ")" | nil ) ]. %:begin 2.3 - "local_indexed_identifier": behaves like % % 2.3 "indexed_identifier", but account for statement-% %:end 2.3 -function definition syntax... % local_indexed_identifier -> identifier' ( "(" <- function_identifier # ( argument_list | nil) ")" | nil ) | array_identifier' ( "(" expression [ "," expression ] ")" | nil % for param. passing % ) | function_identifier' ( "(" # argument_list ")" | nil # ) . indexed_identifier -> identifier' ( "(" <- function_identifier # ( argument_list | nil ) ")" | nil ) | array_identifier' ( "(" expression [ "," expression ] ")" | nil % for param. passing % ) | function_identifier' ( "(" # argument_list ")" | nil # ) . letter_list -> idx' ("-" idx' | nil') [ "," idx' ("-" idx' | nil') ]. integer_list -> integer_item [ "," integer_item ]. dummies -> dummy [ "," dummy ]. dummy -> (idx' | "*"') . io_list -> ( "," | nil ) (data_list | nil). argument_list -> argument [ "," argument ]. argument -> expression. io_unit -> integer_item ( "#" expression | nil ). format_spec -> integer_item | "*". conditions -> [ "," ( except ( "=" integer_constant % ERR=... and END=... % | nil % variable format %) | integer_constant % format label % | "*" % free-format %) ]. encode_decode_spec -> integer_item "," (integer_item | array_identifier) "," indexed_identifier . expression -> expression_8 [ f10_logical_ops' expression_8 ]. expression_8 -> expression_7 [ or' expression_7 ]. expression_7 -> expression_6 [ and' expression_6 ]. expression_6 -> not expression_5 | expression_5. expression_5 -> expression_4 [ relop expression_4 ]. expression_4 -> expression_3 [ addop' expression_3 ]. expression_3 -> expression_2 [ mulop' expression_2 ]. expression_2 -> sign expression_1 | expression_1. expression_1 -> item ( "**"' item | nil ). item -> constant' % constant % | indexed_identifier % variable/array ref. % | intrinsic_identifier' "(" # argument_list ")" % intrinsic function call % | "(" expression ( ")" % back again % | "," expression ")" % complex constants go here % ). type_id -> simple_type' ( "*" integer_constant' | nil ) | double' precision. % stuff for DATA statement % data_list -> data_item [ "," data_item ]. data_item -> indexed_identifier | implicit_do_loop. implicit_do_loop -> "(" data_item [ "," data_item ] ( "=" expression "," expression ( "," expression | nil ) | nil ) ")". data_constant_list -> x_constant ( "*" x_constant | nil ) [ "," x_constant ( "*" x_constant | nil ) ]. signed_constant -> sign constant | constant. x_constant -> "(" signed_constant "," signed_constant ")" % complex constant % | signed_constant.