def do(Interval, Target, IndentF=False): global Setup global Lng if hasattr(Target, "code"): txt = Target.code() elif type(Target) == long: txt = [Lng.GOTO_ADDRESS(Target)] else: txt = [Target] if Interval is not None and Setup.comment_transitions_f: txt.append(Lng.COMMENT(Interval.get_utf8_string())) return txt
def __comment(txt, Node, TheState, GlobalEntryF): """Comment on the states from where the door is entered. RETURNS: String The string contains information about the entries which the node represents. In MegaStates it may be possible that an entry representes entries TO multiple different states. """ # 'Node.child_set is None' => leaf node, i.e. entry from other state. # Otherwise: nothing to be done. if Node.child_set: return "\n" transition_id_list = TheState.entry.get_transition_id_list(Node.door_id) if not transition_id_list: return "\n" msg = "".join( "(%s from %s) " % (x.target_state_index, x.source_state_index) \ for x in transition_id_list ) txt.append(" %s\n" % Lng.COMMENT(msg)[:-1])
def get_skipper(EndSequence, CloserPattern, ModeName, OnSkipRangeOpen, DoorIdAfter): assert len(EndSequence) >= 1 global template_str # Name the $$SKIPPER$$ skipper_index = sm_index.get() skipper_door_id = dial_db.new_door_id(skipper_index) delimiter_str, delimiter_comment_str = get_character_sequence(EndSequence) end_sequence_transformed = transformation.do_sequence(EndSequence) # Determine the $$DELIMITER$$ delimiter_length = len(end_sequence_transformed) delimiter_comment_str = Lng.COMMENT( " Delimiter: %s" % delimiter_comment_str) # Determine the check for the tail of the delimiter delimiter_remainder_test_str = "" if len(EndSequence) != 1: txt = "".join(" %s" % Lng.IF_GOTO(Lng.INPUT_P_DEREFERENCE( i - 1), "!=", "Skipper$$SKIPPER_INDEX$$[%i]" % i, skipper_door_id, i == 1) for i, letter in enumerate(EndSequence[1:], start=1)) delimiter_remainder_test_str = txt door_id_reload = dial_db.new_door_id() on_skip_range_open = get_on_skip_range_open(OnSkipRangeOpen, CloserPattern) # The main part code_str = blue_print( template_str, [ ["$$DELIMITER_COMMENT$$", delimiter_comment_str], ["$$INPUT_P_INCREMENT$$", Lng.INPUT_P_INCREMENT()], ["$$INPUT_P_DECREMENT$$", Lng.INPUT_P_DECREMENT()], ["$$INPUT_GET$$", Lng.ACCESS_INPUT()], [ "$$IF_INPUT_EQUAL_DELIMITER_0$$", Lng.IF_INPUT("==", "Skipper$$SKIPPER_INDEX$$[0]") ], ["$$ENDIF$$", Lng.END_IF()], ["$$ENTRY$$", dial_db.get_label_by_door_id(skipper_door_id)], ["$$RELOAD$$", dial_db.get_label_by_door_id(door_id_reload)], ["$$GOTO_ENTRY$$", Lng.GOTO(skipper_door_id)], ["$$INPUT_P_TO_LEXEME_START$$", Lng.INPUT_P_TO_LEXEME_START()], # When things were skipped, no change to acceptance flags or modes has # happend. One can jump immediately to the start without re-entry preparation. ["$$GOTO_AFTER_END_OF_SKIPPING$$", Lng.GOTO(DoorIdAfter)], ["$$MARK_LEXEME_START$$", Lng.LEXEME_START_SET()], ["$$DELIMITER_REMAINDER_TEST$$", delimiter_remainder_test_str], ["$$ON_SKIP_RANGE_OPEN$$", on_skip_range_open], ]) # Line and column number counting code_str, reference_p_f = __lc_counting_replacements(code_str, EndSequence) # The finishing touch code_str = blue_print( code_str, [["$$SKIPPER_INDEX$$", __nice(skipper_index)], ["$$GOTO_RELOAD$$", Lng.GOTO(door_id_reload)]]) if reference_p_f: variable_db.require("reference_p", Condition="QUEX_OPTION_COLUMN_NUMBER_COUNTING") variable_db.require_array("Skipper%i", Initial="{ %s }" % delimiter_str, ElementN=delimiter_length, Index=skipper_index) variable_db.require("Skipper%iL", "%i" % delimiter_length, Index=skipper_index) variable_db.require("text_end") variable_db.require("input") return [code_str]
def __frame(FunctionName, CodeTxt, IteratorName, DoorIdReturn, dial_db): txt = [ \ "static void\n" \ + "%s(QUEX_TYPE_ANALYZER* me, QUEX_TYPE_LEXATOM* LexemeBegin, QUEX_TYPE_LEXATOM* LexemeEnd)\n" % FunctionName \ + "{\n" \ ] if IteratorName: state_router_adr = DoorID.global_state_router(dial_db).related_address state_router_label = Lng.LABEL_STR_BY_ADR(state_router_adr) txt.extend([ "# define self (*me)\n", "/* 'QUEX_GOTO_STATE' requires 'QUEX_LABEL_STATE_ROUTER' */\n", "# define QUEX_LABEL_STATE_ROUTER %s\n" % state_router_label ]) # Following function refers to the global 'variable_db' txt.append(Lng.VARIABLE_DEFINITIONS(variable_db)) txt.extend([ " (void)me;\n", Lng.COUNTER_SHIFT_VALUES(), "%s" % Lng.ML_COMMENT("Allow LexemeBegin == LexemeEnd (e.g. END_OF_STREAM)\n" "=> Caller does not need to check\n" "BUT, if so quit immediately after 'shift values'."), " __quex_assert(LexemeBegin <= LexemeEnd);\n", " %s" % Lng.IF("LexemeBegin", "==", "LexemeEnd"), " %s\n" % Lng.PURE_RETURN, " %s\n" % Lng.END_IF, " %s = LexemeBegin;\n" % IteratorName ]) txt.extend(CodeTxt) if IteratorName: door_id_failure = DoorID.incidence(E_IncidenceIDs.MATCH_FAILURE, dial_db) door_id_bad_lexatom = DoorID.incidence(E_IncidenceIDs.BAD_LEXATOM, dial_db) txt.append( "%s /* TERMINAL: BAD_LEXATOM */\n;\n" % Lng.LABEL(door_id_bad_lexatom) # BETTER: A lexeme that is 'counted' has already matched! # => FAILURE is impossible! # "%s /* TERMINAL: FAILURE */\n%s\n" % Lng.UNREACHABLE + "%s /* TERMINAL: FAILURE */\n%s\n" % (Lng.LABEL(door_id_failure), Lng.GOTO(DoorIdReturn, dial_db)) ) txt.append( "%s\n" % Lng.LABEL(DoorIdReturn) + "%s\n" % Lng.COMMENT("Assert: lexeme in codec's character boundaries.") \ + " __quex_assert(%s == LexemeEnd);\n" % IteratorName \ + " return;\n" \ + "".join(generator.do_state_router(dial_db)) \ + "%s\n" % Lng.UNDEFINE("self") + "%s\n" % Lng.UNDEFINE("QUEX_LABEL_STATE_ROUTER") # If there is no MATCH_FAILURE, then DoorIdBeyond is still referenced as 'gotoed', # but MATCH_FAILURE is never implemented, later on, because its DoorId is not # referenced. + "$$<not-computed-gotos>----------------------------------------------\n" + " %s /* in QUEX_GOTO_STATE */\n" % Lng.GOTO(DoorID.global_state_router(dial_db), dial_db) + " %s /* to BAD_LEXATOM */\n" % Lng.GOTO(DoorID.incidence(E_IncidenceIDs.BAD_LEXATOM, dial_db), dial_db) + "$$------------------------------------------------------------------\n" + " %s\n" % Lng.COMMENT("Avoid compiler warning: 'Unused labels'") \ + " %s\n" % Lng.GOTO(door_id_failure, dial_db) \ + " (void)target_state_index;\n" + " (void)target_state_else_index;\n" ) txt.append("}\n") return "".join(Lng.GET_PLAIN_STRINGS(txt, dial_db))