Legal test end-main-with-m2:
 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_XY_ROTATION(0.0000)
 N..... SET_FEED_REFERENCE(CANON_XYZ)
 N..... ON_RESET()
 N..... COMMENT("legal example")
 N..... COMMENT("Main program defined with numeric O-word title, terminated by M2")
 N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... COMMENT("calling sub 2")
 N..... COMMENT("in sub 2")
 N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 3.0000, 0.0000, 0.0000, 0.0000)
 N..... COMMENT("returning from sub 2")
 N..... COMMENT("returned from sub 2")
 N..... COMMENT("end of main")
 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_XY_ROTATION(0.0000)
 N..... SET_FEED_MODE(0, 0)
 N..... SET_FEED_RATE(0.0000)
 N..... STOP_SPINDLE_TURNING(0)
 N..... SET_SPINDLE_MODE(0 0.0000)
 N..... PROGRAM_END()
 N..... ON_RESET()
 N..... ON_RESET()
Legal test end-main-with-m02:
 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_XY_ROTATION(0.0000)
 N..... SET_FEED_REFERENCE(CANON_XYZ)
 N..... ON_RESET()
 N..... COMMENT("legal example")
 N..... COMMENT("Main program defined with numeric O-word title, terminated by M02")
 N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... COMMENT("calling sub 2")
 N..... COMMENT("in sub 2")
 N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 3.0000, 0.0000, 0.0000, 0.0000)
 N..... COMMENT("returning from sub 2")
 N..... COMMENT("returned from sub 2")
 N..... COMMENT("end of main")
 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_XY_ROTATION(0.0000)
 N..... SET_FEED_MODE(0, 0)
 N..... SET_FEED_RATE(0.0000)
 N..... STOP_SPINDLE_TURNING(0)
 N..... SET_SPINDLE_MODE(0 0.0000)
 N..... PROGRAM_END()
 N..... ON_RESET()
 N..... ON_RESET()
Legal test end-main-with-m30:
 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_XY_ROTATION(0.0000)
 N..... SET_FEED_REFERENCE(CANON_XYZ)
 N..... ON_RESET()
 N..... COMMENT("legal example")
 N..... COMMENT("Main program defined with numeric O-word title, terminated by M30")
 N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... COMMENT("calling sub 2")
 N..... COMMENT("in sub 2")
 N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 3.0000, 0.0000, 0.0000, 0.0000)
 N..... COMMENT("returning from sub 2")
 N..... COMMENT("returned from sub 2")
 N..... COMMENT("end of main")
 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_XY_ROTATION(0.0000)
 N..... SET_FEED_MODE(0, 0)
 N..... SET_FEED_RATE(0.0000)
 N..... STOP_SPINDLE_TURNING(0)
 N..... SET_SPINDLE_MODE(0 0.0000)
 N..... PALLET_SHUTTLE()
 N..... PROGRAM_END()
 N..... ON_RESET()
 N..... ON_RESET()
Legal test end-main-with-percent:
 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_XY_ROTATION(0.0000)
 N..... SET_FEED_REFERENCE(CANON_XYZ)
 N..... ON_RESET()
 N..... COMMENT("legal example")
 N..... COMMENT("Main program defined with numeric O-word title, terminated by percent")
 N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... COMMENT("calling sub 2")
 N..... COMMENT("in sub 2")
 N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 3.0000, 0.0000, 0.0000, 0.0000)
 N..... COMMENT("returning from sub 2")
 N..... COMMENT("returned from sub 2")
 N..... COMMENT("end of main signaled by percent")
 N..... FINISH()
 N..... ON_RESET()
 N..... ON_RESET()
Illegal test end-main-with-eof:
 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_XY_ROTATION(0.0000)
 N..... SET_FEED_REFERENCE(CANON_XYZ)
 N..... ON_RESET()
 N..... COMMENT("legal example")
 N..... COMMENT("Main program defined with numeric O-word title, terminated by EOF")
 N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... COMMENT("calling sub 2")
 N..... COMMENT("in sub 2")
 N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 3.0000, 0.0000, 0.0000, 0.0000)
 N..... COMMENT("returning from sub 2")
 N..... COMMENT("returned from sub 2")
 N..... COMMENT("end of main signaled by EOF")
 N..... ON_RESET()
 N..... ON_RESET()
Illegal test no-m30-before-osub:
 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_XY_ROTATION(0.0000)
 N..... SET_FEED_REFERENCE(CANON_XYZ)
 N..... ON_RESET()
 N..... COMMENT("illegal example")
 N..... COMMENT("Define rs274-style sub before numeric O-word main program end")
 N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... COMMENT("calling sub 2")
 N..... COMMENT("in sub 2")
 N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 3.0000, 0.0000, 0.0000, 0.0000)
 N..... COMMENT("returning from sub 2")
 N..... COMMENT("returned from sub 2")
 N..... COMMENT("Illegal: O-sub with no M02 or M30 terminating main")
 N..... ON_RESET()
 N..... ON_RESET()
Illegal test sub-after-percent:
 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... SET_XY_ROTATION(0.0000)
 N..... SET_FEED_REFERENCE(CANON_XYZ)
 N..... ON_RESET()
 N..... COMMENT("illegal example")
 N..... COMMENT("Define sub after percent [= after EOF]")
 N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000)
 N..... COMMENT("calling sub 2")
 N..... FINISH()
 N..... ON_RESET()
 N..... ON_RESET()
