def __frame(FunctionName, IteratorName, CodeTxt, DoorIdReturn, DoorIdBeyond): txt = [ \ "#ifdef __QUEX_OPTION_COUNTER\n" \ + "static void\n" \ + "%s(QUEX_TYPE_ANALYZER* me, QUEX_TYPE_CHARACTER* LexemeBegin, QUEX_TYPE_CHARACTER* LexemeEnd)\n" \ % FunctionName \ + "{\n" \ + "# define self (*me)\n" \ + "/* 'QUEX_GOTO_STATE' requires 'QUEX_LABEL_STATE_ROUTER' */\n" + "# define QUEX_LABEL_STATE_ROUTER %s\n" % dial_db.get_label_by_door_id(DoorID.global_state_router()) ] # Following function refers to the global 'variable_db' txt.append(Lng.VARIABLE_DEFINITIONS(variable_db)) txt.append( " (void)me;\n" " __QUEX_IF_COUNT_SHIFT_VALUES();\n" " /* Allow LexemeBegin == LexemeEnd (e.g. END_OF_STREAM)\n" " * => Caller does not need to check\n" " * BUT, if so quit immediately after 'shift values'. */\n" " __quex_assert(LexemeBegin <= LexemeEnd);\n" " if(LexemeBegin == LexemeEnd) return;\n" " %s = LexemeBegin;\n" % IteratorName ) txt.extend(CodeTxt) door_id_failure = DoorID.incidence(E_IncidenceIDs.MATCH_FAILURE) txt.append( "%s /* TERMINAL: FAILURE */\n%s\n" % (Lng.LABEL(door_id_failure), Lng.GOTO(DoorIdBeyond)) ) txt.append( "%s:\n" % dial_db.get_label_by_door_id(DoorIdReturn) \ + " __quex_assert(%s == LexemeEnd); /* Otherwise, lexeme violates codec character boundaries. */\n" \ % IteratorName \ + " return;\n" \ + "".join(generator.do_state_router()) \ + "# undef self\n" \ + "# undef QUEX_LABEL_STATE_ROUTER\n" # 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. + "# if ! defined(QUEX_OPTION_COMPUTED_GOTOS)\n" + " %s /* in QUEX_GOTO_STATE */\n" % Lng.GOTO(DoorID.global_state_router()) + "# endif\n" + " /* Avoid compiler warning: Unused label for 'TERMINAL <BEYOND>' */\n" \ + " %s\n" % Lng.GOTO(DoorIdBeyond) \ + " %s\n" % Lng.GOTO(door_id_failure) \ + " (void)target_state_index;\n" + " (void)target_state_else_index;\n" + "}\n" \ + "#endif /* __QUEX_OPTION_COUNTER */\n" ) return "".join(Lng.GET_PLAIN_STRINGS(txt))
def get_transition_function(iid_map, Codec): if Codec == "UTF8": Setup.buffer_codec_set(bc_factory.do("utf8"), 1) else: Setup.buffer_codec_set(bc_factory.do("unicode"), -1) sm = StateMachine.from_IncidenceIdMap(iid_map) dummy, sm = Setup.buffer_codec.do_state_machine(sm, beautifier) analyzer = analyzer_generator.do(sm, engine.CHARACTER_COUNTER) tm_txt = do_analyzer(analyzer) tm_txt = Lng.GET_PLAIN_STRINGS(tm_txt) tm_txt.append("\n") #label = dial_db.get_label_by_door_id(DoorID.incidence(E_IncidenceIDs.MATCH_FAILURE)) for character_set, iid in iid_map: tm_txt.append("%s return (int)%s;\n" % (Lng.LABEL(DoorID.incidence(iid)), iid)) tm_txt.append("%s return (int)-1;\n" % Lng.LABEL(DoorID.drop_out(-1))) return "".join(tm_txt)
def get_transition_function(iid_map, Codec): if Codec == "UTF8": Setup.buffer_codec_prepare("utf8", Module=utf8_state_split) else: Setup.buffer_codec_prepare("unicode") cssm = CharacterSetStateMachine(iid_map, MaintainLexemeF=False) analyzer = analyzer_generator.do(cssm.sm, engine.CHARACTER_COUNTER) tm_txt = do_analyzer(analyzer) tm_txt = Lng.GET_PLAIN_STRINGS(tm_txt) tm_txt.append("\n") label = dial_db.get_label_by_door_id( DoorID.incidence(E_IncidenceIDs.MATCH_FAILURE)) for character_set, iid in iid_map: tm_txt.append("%s return (int)%s;\n" % (Lng.LABEL(DoorID.incidence(iid)), iid)) tm_txt.append("%s return (int)-1;\n" % Lng.LABEL(DoorID.drop_out(-1))) return "".join(tm_txt)
def get_transition_function(iid_map, Codec): global dial_db if Codec == "UTF8": Setup.buffer_setup("uint8_t", 1, "utf8") else: Setup.buffer_setup("uint32_t", 4, "none") Setup.bad_lexatom_detection_f = False sm = DFA.from_IncidenceIdMap(iid_map) analyzer = analyzer_generator.do(sm, engine.CHARACTER_COUNTER, dial_db=dial_db, CutF=False) tm_txt = do_analyzer(analyzer) tm_txt = Lng.GET_PLAIN_STRINGS(tm_txt, dial_db=dial_db) tm_txt.append("\n") #label = dial_db.get_label_by_door_id(DoorID.incidence(E_IncidenceIDs.MATCH_FAILURE)) for character_set, iid in iid_map: tm_txt.append("%s return (int)%s;\n" % (Lng.LABEL(DoorID.incidence(iid, dial_db)), iid)) tm_txt.append("%s return (int)-1;\n" % Lng.LABEL(DoorID.drop_out(-1, dial_db))) return "".join(tm_txt)
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))