diff --git a/src/fortran/ofp/parser/FortranParserBase.g b/src/fortran/ofp/parser/FortranParserBase.g index 18c52f4..09d87fd 100644 --- a/src/fortran/ofp/parser/FortranParserBase.g +++ b/src/fortran/ofp/parser/FortranParserBase.g @@ -239,11 +239,12 @@ declaration_construct // R208 execution_part +@init{int count = 0;} @after { - action.execution_part(); + action.execution_part(count); } : executable_construct - ( execution_part_construct )* + ( execution_part_construct {count += 1;} )* ; // R209 @@ -5665,11 +5666,16 @@ end_function_stmt // specification_part made non-optional to remove END ambiguity (as can // be empty) subroutine_subprogram +@init { + boolean hasExePart = false; + boolean hasIntSubProg = false; +} : subroutine_stmt specification_part - ( execution_part )? - ( internal_subprogram_part )? + ( execution_part { hasExePart=true; } )? + ( internal_subprogram_part { hasIntSubProg=true; } )? end_subroutine_stmt + { action.subroutine_subprogram(hasExePart, hasIntSubProg); } ; // R1232 diff --git a/src/fortran/ofp/parser/java/FortranParserActionPrint.java b/src/fortran/ofp/parser/java/FortranParserActionPrint.java index dc64fb1..5a44bfe 100644 --- a/src/fortran/ofp/parser/java/FortranParserActionPrint.java +++ b/src/fortran/ofp/parser/java/FortranParserActionPrint.java @@ -145,8 +145,9 @@ public void declaration_construct() { * execution_part * */ - public void execution_part() { + public void execution_part(int count) { printRuleHeader(208, "execution-part"); + printParameter(count, "count"); printRuleTrailer(); } @@ -4928,6 +4929,22 @@ public void end_function_stmt(Token label, Token keyword1, Token keyword2, printRuleTrailer(); } + /** + * R1231 + * subroutine_subprogram + * + * @param hasExePart Flag specifying if optional execution_part was given. + * @param hasIntSubProg Flag specifying if optional + * internal_subprogram_part was given. + */ + public void subroutine_subprogram(boolean hasExePart, + boolean hasIntSubProg) { + printRuleHeader(1231, "subroutine-subprogram"); + printParameter(hasExePart, "hasExePart"); + printParameter(hasIntSubProg, "hasIntSubProg"); + printRuleTrailer(); + } + /** R1232 * subroutine_stmt__begin */ diff --git a/src/fortran/ofp/parser/java/IFortranParserAction.java b/src/fortran/ofp/parser/java/IFortranParserAction.java index 1e7483b..c5f7714 100644 --- a/src/fortran/ofp/parser/java/IFortranParserAction.java +++ b/src/fortran/ofp/parser/java/IFortranParserAction.java @@ -61,7 +61,7 @@ public abstract interface IFortranParserAction { /** R208 * execution_part */ - public abstract void execution_part(); + public abstract void execution_part(int count); /** R209 * execution_part_construct @@ -4282,6 +4282,16 @@ public abstract void function_stmt(Token label, Token keyword, Token name, */ public abstract void subroutine_stmt__begin(); + /** R1231 + * subroutine_subprogram + * + * @param hasExePart Flag specifying if optional execution_part was given. + * @param hasIntSubProg Flag specifying if optional internal_subprogram_part + * was given. + */ + public abstract void + subroutine_subprogram(boolean hasExePart, boolean hasIntSubProg); + /** R1232 * subroutine_stmt * : (label)? (t_prefix )? T_SUBROUTINE T_IDENT