本文整理匯總了Python中quex.engine.state_machine.core.StateMachine.create_new_init_state方法的典型用法代碼示例。如果您正苦於以下問題:Python StateMachine.create_new_init_state方法的具體用法?Python StateMachine.create_new_init_state怎麽用?Python StateMachine.create_new_init_state使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類quex.engine.state_machine.core.StateMachine
的用法示例。
在下文中一共展示了StateMachine.create_new_init_state方法的1個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Python代碼示例。
示例1: do
# 需要導入模塊: from quex.engine.state_machine.core import StateMachine [as 別名]
# 或者: from quex.engine.state_machine.core.StateMachine import create_new_init_state [as 別名]
def do(SM):
"""Creates a state machine that matches the reverse of what 'SM' matches.
"""
result = StateMachine(InitStateIndex=SM.init_state_index)
original_acceptance_state_index_list = SM.get_acceptance_state_index_list()
if len(original_acceptance_state_index_list) == 0:
# If there is no acceptance state in a state machine, the state machine
# cannot match any pattern, it is equivalent to '\None'. The reverse
# of \None is \None.
return special.get_none()
# Ensure that each target state index has a state inside the state machine
for state_index in SM.states.keys():
result.create_new_state(StateIdx=state_index)
for state_index, state in SM.states.items():
for target_state_index, trigger_set in state.target_map.get_map().items():
result.states[target_state_index].add_transition(trigger_set.clone(), state_index)
for target_state_index in state.target_map.get_epsilon_target_state_index_list():
result.states[target_state_index].target_map.add_epsilon_target_state(state_index)
# -- copy all origins of the original state machine
# -- We need to cancel any acceptance, because the inverted engine now starts
# from a combination of the acceptance states and ends at the initial state.
for state_index, state in SM.states.items():
original_origin_list = [origin.clone() for origin in state.origins()]
for origin in original_origin_list:
origin.set_input_position_restore_f(False)
origin.set_pre_context_id(E_PreContextIDs.NONE)
origin.set_acceptance_f(False)
result.states[state_index].origins().set(original_origin_list) # deepcopy implicit
# -- only the ORIGINAL initial state becomes an acceptance state (end of inverse)
result.states[SM.init_state_index].set_acceptance(True)
# -- setup an epsilon transition from an new init state to all previous
# acceptance states.
new_init_state_index = result.create_new_init_state()
for state_index in original_acceptance_state_index_list:
result.add_epsilon_transition(new_init_state_index, state_index)
# -- for uniqueness of state ids, clone the result
return result.clone()