grammar keywords; options { language=Java; k=*; } procedureDecl : PROCEDURE IDENTIFIER SEMICOLON subroutineBlock ; subroutineBlock : external SEMICOLON | forward SEMICOLON | asmBlock SEMICOLON ; asmBlock : assembler SEMICOLON ASM END ; external: {input.LT(1).getText().toLowerCase().equals("external")}? IDENTIFIER; forward: {input.LT(1).getText().toLowerCase().equals("forward")}? IDENTIFIER; assembler: {input.LT(1).getText().toLowerCase().equals("assembler")}? IDENTIFIER; SEMICOLON: ';'; PROCEDURE: 'PROCEDURE'; ASM: 'ASM'; BEGIN: 'BEGIN'; END: 'END'; IDENTIFIER: ('a'..'z'|'A'..'Z')+; WS: (' '|'\r'|'\n')+ {$channel = HIDDEN;};