# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
import bisect
-import element
+#import element
import flex_dfa
import numpy
import numpy_heap
i += 1
return None
- def match_yychunk(self, root, pos, off, yychunk_iter, start_index = 0):
- if pos < 0:
- pos, off = element.to_start_relative(root, pos, off)
-
- def transit(transition):
- nonlocal threads0, threads1, prefix_slop # note: also uses pos, off
- j = prefix_slop
- for trans in transition:
- if trans[0] == DFA.TRANSITION_POP:
- j += trans[1]
- elif trans[0] == DFA.TRANSITION_DUP:
- while j < trans[1]:
- threads0[:0] = [None] * prefix_slop
- threads1[:0] = [None] * prefix_slop
- j += prefix_slop
- prefix_slop *= 2
- threads0[j - trans[1]:j] = threads0[j:j + trans[1]]
- j -= trans[1]
- elif trans[0] == DFA.TRANSITION_MARK:
- threads0[j:j + trans[1]] = [
- (pos, off, trans[2], thread)
- for thread in threads0[j:j + trans[1]]
- ]
- elif trans[0] == DFA.TRANSITION_MOVE:
- threads1.extend(threads0[j:j + trans[1]])
- j += trans[1]
- #elif trans[0] == DFA.TRANSITION_DEL:
- # del threads1[-trans[1]:]
- else:
- assert False
- assert j == len(threads0)
- threads0, threads1 = threads1, threads0
- del threads1[prefix_slop:]
-
- threads0 = [None, None]
- threads1 = [None]
- prefix_slop = 1
+ #def match_yychunk(self, root, pos, off, yychunk_iter, start_index = 0):
+ # if pos < 0:
+ # pos, off = element.to_start_relative(root, pos, off)
- action = self.start_action[start_index]
- text = element.get_text(root, pos)
- while action != -1:
- state, transition = self.actions[action]
- transit(transition)
- if state == 0:
- # there is only one match, which is complete
- assert len(threads0) == prefix_slop + 1
- assert self.states[state][2] == [0]
- return threads0[prefix_slop]
- while off >= len(text):
- if pos < len(root):
- pos += 1
- off = 0
- else:
- try:
- next(yychunk_iter)
- except StopIteration:
- # return best match we have, but not incomplete match
- accept = self.states[state][2]
- return threads0[prefix_slop + accept[0]] if len(accept) else None
- text = element.get_text(root, pos)
- #print(
- # 'state {0:d} pos {1:d} off {2:d} text "{3:s}"'.format(
- # state,
- # pos,
- # off,
- # text.replace('\n', '$')
- # )
- #)
- action = self.states[state][1][
- bisect.bisect_right(self.states[state][0], ord(text[off]))
- ]
- off += 1
- return None
+ # def transit(transition):
+ # nonlocal threads0, threads1, prefix_slop # note: also uses pos, off
+ # j = prefix_slop
+ # for trans in transition:
+ # if trans[0] == DFA.TRANSITION_POP:
+ # j += trans[1]
+ # elif trans[0] == DFA.TRANSITION_DUP:
+ # while j < trans[1]:
+ # threads0[:0] = [None] * prefix_slop
+ # threads1[:0] = [None] * prefix_slop
+ # j += prefix_slop
+ # prefix_slop *= 2
+ # threads0[j - trans[1]:j] = threads0[j:j + trans[1]]
+ # j -= trans[1]
+ # elif trans[0] == DFA.TRANSITION_MARK:
+ # threads0[j:j + trans[1]] = [
+ # (pos, off, trans[2], thread)
+ # for thread in threads0[j:j + trans[1]]
+ # ]
+ # elif trans[0] == DFA.TRANSITION_MOVE:
+ # threads1.extend(threads0[j:j + trans[1]])
+ # j += trans[1]
+ # #elif trans[0] == DFA.TRANSITION_DEL:
+ # # del threads1[-trans[1]:]
+ # else:
+ # assert False
+ # assert j == len(threads0)
+ # threads0, threads1 = threads1, threads0
+ # del threads1[prefix_slop:]
+
+ # threads0 = [None, None]
+ # threads1 = [None]
+ # prefix_slop = 1
+
+ # action = self.start_action[start_index]
+ # text = element.get_text(root, pos)
+ # while action != -1:
+ # state, transition = self.actions[action]
+ # transit(transition)
+ # if state == 0:
+ # # there is only one match, which is complete
+ # assert len(threads0) == prefix_slop + 1
+ # assert self.states[state][2] == [0]
+ # return threads0[prefix_slop]
+ # while off >= len(text):
+ # if pos < len(root):
+ # pos += 1
+ # off = 0
+ # else:
+ # try:
+ # next(yychunk_iter)
+ # except StopIteration:
+ # # return best match we have, but not incomplete match
+ # accept = self.states[state][2]
+ # return threads0[prefix_slop + accept[0]] if len(accept) else None
+ # text = element.get_text(root, pos)
+ # #print(
+ # # 'state {0:d} pos {1:d} off {2:d} text "{3:s}"'.format(
+ # # state,
+ # # pos,
+ # # off,
+ # # text.replace('\n', '$')
+ # # )
+ # #)
+ # action = self.states[state][1][
+ # bisect.bisect_right(self.states[state][0], ord(text[off]))
+ # ]
+ # off += 1
+ # return None
#def yylex(self, root, pos, off, factory, yychunk_iter):
# if pos < 0:
import bisect
import dfa
-import element
+#import element
# defines the alphabet size, set this to 0x11000 for unicode
n_characters = 0x100
i += 1
return None
- def match_yychunk(self, root, pos, off, yychunk_iter, start_index = 0):
- if pos < 0:
- pos, off = element.to_start_relative(root, pos, off)
+ #def match_yychunk(self, root, pos, off, yychunk_iter, start_index = 0):
+ # if pos < 0:
+ # pos, off = element.to_start_relative(root, pos, off)
- def transit(transition):
- nonlocal threads0, threads1, prefix_slop # note: also uses pos, off
- j = prefix_slop
- for trans in transition:
- if trans[0] == dfa.DFA.TRANSITION_POP:
- j += trans[1]
- elif trans[0] == dfa.DFA.TRANSITION_DUP:
- while j < trans[1]:
- threads0[:0] = [None] * prefix_slop
- threads1[:0] = [None] * prefix_slop
- j += prefix_slop
- prefix_slop *= 2
- threads0[j - trans[1]:j] = threads0[j:j + trans[1]]
- j -= trans[1]
- elif trans[0] == dfa.DFA.TRANSITION_MARK:
- threads0[j:j + trans[1]] = [
- (pos, off, trans[2], thread)
- for thread in threads0[j:j + trans[1]]
- ]
- elif trans[0] == dfa.DFA.TRANSITION_MOVE:
- threads1.extend(threads0[j:j + trans[1]])
- j += trans[1]
- #elif trans[0] == dfa.DFA.TRANSITION_DEL:
- # del threads1[-trans[1]:]
- else:
- assert False
- assert j == len(threads0)
- threads0, threads1 = threads1, threads0
- del threads1[prefix_slop:]
+ # def transit(transition):
+ # nonlocal threads0, threads1, prefix_slop # note: also uses pos, off
+ # j = prefix_slop
+ # for trans in transition:
+ # if trans[0] == dfa.DFA.TRANSITION_POP:
+ # j += trans[1]
+ # elif trans[0] == dfa.DFA.TRANSITION_DUP:
+ # while j < trans[1]:
+ # threads0[:0] = [None] * prefix_slop
+ # threads1[:0] = [None] * prefix_slop
+ # j += prefix_slop
+ # prefix_slop *= 2
+ # threads0[j - trans[1]:j] = threads0[j:j + trans[1]]
+ # j -= trans[1]
+ # elif trans[0] == dfa.DFA.TRANSITION_MARK:
+ # threads0[j:j + trans[1]] = [
+ # (pos, off, trans[2], thread)
+ # for thread in threads0[j:j + trans[1]]
+ # ]
+ # elif trans[0] == dfa.DFA.TRANSITION_MOVE:
+ # threads1.extend(threads0[j:j + trans[1]])
+ # j += trans[1]
+ # #elif trans[0] == dfa.DFA.TRANSITION_DEL:
+ # # del threads1[-trans[1]:]
+ # else:
+ # assert False
+ # assert j == len(threads0)
+ # threads0, threads1 = threads1, threads0
+ # del threads1[prefix_slop:]
- threads0 = [None, None]
- threads1 = [None]
- prefix_slop = 1
+ # threads0 = [None, None]
+ # threads1 = [None]
+ # prefix_slop = 1
- start_state = self.start_state[start_index]
- if start_state == -1:
- return None
- next_multistate, transition, _, _ = self.multistate_next(
- (NFA.MULTISTATE_AND, 1, start_state, NFA.accept_multistate),
- -1
- )
- text = element.get_text(root, pos)
- while next_multistate is not None:
- transit(transition)
- assert len(threads0) == prefix_slop + next_multistate[1]
- if next_multistate == NFA.accept_multistate:
- # there is only one match, which is complete
- assert len(threads0) == prefix_slop + 1
- return threads0[prefix_slop]
- while off >= len(text):
- if pos < len(root):
- pos += 1
- off = 0
- else:
- try:
- next(yychunk_iter)
- except StopIteration:
- # return best match we have, but not incomplete match
- accept = NFA.multistate_accept(next_multistate)
- return threads0[prefix_slop + accept[0]] if len(accept) else None
- text = element.get_text(root, pos)
- next_multistate, transition, _, _ = (
- self.multistate_next(next_multistate, ord(text[off]))
- )
- off += 1
- return None
+ # start_state = self.start_state[start_index]
+ # if start_state == -1:
+ # return None
+ # next_multistate, transition, _, _ = self.multistate_next(
+ # (NFA.MULTISTATE_AND, 1, start_state, NFA.accept_multistate),
+ # -1
+ # )
+ # text = element.get_text(root, pos)
+ # while next_multistate is not None:
+ # transit(transition)
+ # assert len(threads0) == prefix_slop + next_multistate[1]
+ # if next_multistate == NFA.accept_multistate:
+ # # there is only one match, which is complete
+ # assert len(threads0) == prefix_slop + 1
+ # return threads0[prefix_slop]
+ # while off >= len(text):
+ # if pos < len(root):
+ # pos += 1
+ # off = 0
+ # else:
+ # try:
+ # next(yychunk_iter)
+ # except StopIteration:
+ # # return best match we have, but not incomplete match
+ # accept = NFA.multistate_accept(next_multistate)
+ # return threads0[prefix_slop + accept[0]] if len(accept) else None
+ # text = element.get_text(root, pos)
+ # next_multistate, transition, _, _ = (
+ # self.multistate_next(next_multistate, ord(text[off]))
+ # )
+ # off += 1
+ # return None
def to_dfa(self):
_dfa = dfa.DFA()
# [
# j
# for i in range(len(node))
- # for j in [element.get_text(node, i), to_text(node[i])]
+ # for j in [node.text[i], to_text(node[i])]
# ] +
- # [element.get_text(node, len(node))]
+ # [node.text[len(node])]
# )
#text = '{0:s}/{1:s}'.format(to_text(self.children[0]), to_text(self.children[1]))
- #element.set_text(
- # _ast.actions_text[-1],
- # 0,
+ #_ast.actions_text[-1].text[0] = \
# 'fprintf(stderr, "%d >>>%s<<< {0:s}\\n", yy_start, yytext);\n{1:s}'.format(
# text.replace('\\', '\\\\').replace('"', '\\"').replace('%', '%%'),
- # element.get_text(_ast.actions_text[-1], 0)
+ # _ast.actions_text[-1].text[0]
# )
#)
_ast.flex_rules.append(self)
@method(AST.Text)
def get_text(self):
- return element.get_text(self, 0)
+ return self.text[0]
del get_text
@method(AST)
@method(Text)
def get_text(self):
- return element.get_text(self, 0)
+ return self.text[0]
del get_text
if __name__ == '__main__':
@method(Text)
def get_text(self):
- return element.get_text(self, 0)
+ return self.text[0]
del get_text
@method(AST.Expr)
raise NotImplementedException()
@method(AST.Num)
def eval(self):
- return float(element.get_text(self, 0))
+ return float(self.text[0])
@method(AST.Add)
def eval(self):
return self[0].eval() + self[1].eval()