X-Git-Url: http://nitlanguage.org diff --git a/contrib/nitcc/src/re2nfa.nit b/contrib/nitcc/src/re2nfa.nit index 1fa3cff..9cc0e7b 100644 --- a/contrib/nitcc/src/re2nfa.nit +++ b/contrib/nitcc/src/re2nfa.nit @@ -20,7 +20,7 @@ import autom redef class Node # Build the NFA of the regular expression - fun make_rfa: Automaton do + fun make_nfa: Automaton do print inspect abort end @@ -33,13 +33,12 @@ redef class Node end redef class Nstr - redef fun value: String do return text.substring(1, text.length-2).unescape_nit - redef fun make_rfa: Automaton + redef fun value do return text.substring(1, text.length-2).unescape_nit + redef fun make_nfa do var a = new Automaton.epsilon - var val for c in self.value.chars do - var b = new Automaton.atom(c.ascii) + var b = new Automaton.atom(c.code_point) a.concat(b) end return a @@ -47,50 +46,59 @@ redef class Nstr end redef class Nch_dec - redef fun value: String do return text.substring_from(1).to_i.ascii.to_s - redef fun make_rfa: Automaton + redef fun value do return text.substring_from(1).to_i.code_point.to_s + redef fun make_nfa do - var a = new Automaton.atom(self.value.chars.first.ascii) + var a = new Automaton.atom(self.value.chars.first.code_point) return a end end redef class Nch_hex - redef fun value: String do return text.substring_from(2).to_hex.ascii.to_s - redef fun make_rfa: Automaton + redef fun value do return text.substring_from(2).to_hex.code_point.to_s + redef fun make_nfa do - var a = new Automaton.atom(self.value.chars.first.ascii) + var a = new Automaton.atom(self.value.chars.first.code_point) return a end end redef class NProd - redef fun make_rfa: Automaton + redef fun make_nfa do - assert children.length == 1 else print "no make_rfa for {self}" - return children.first.make_rfa + assert children.length == 1 else print "no make_nfa for {self}" + return children.first.make_nfa end end redef class Nre_alter - redef fun make_rfa + redef fun make_nfa do - var a = children[0].make_rfa - var b = children[2].make_rfa + var a = children[0].make_nfa + var b = children[2].make_nfa a.alternate(b) return a end end redef class Nre_minus - redef fun make_rfa + redef fun make_nfa do - var a = children[0].make_rfa - var b = children[2].make_rfa.to_dfa + var a = children[0].make_nfa + var b = children[2].make_nfa.to_dfa for t in b.start.outs do if not t.to.outs.is_empty then - print "Not Yet Implemented Error: '-' only works on single char" - exit(1) + # `b` is not a single char, so just use except + # "a - b == a Except (Any* b Any*)" + var any1 = new Automaton.cla(0, null) + any1.close + var any2 = new Automaton.cla(0, null) + any2.close + var b2 = any1 + b2.concat(b) + b2.concat(any2) + var c = a.except(b2) + return c end a.minus_sym(t.symbol.as(not null)) end @@ -98,13 +106,21 @@ redef class Nre_minus end end +redef class Nre_end + redef fun make_nfa + do + print "{children.first.position.to_s}: NOT YET IMPLEMENTED: token `End`; replaced with an empty string" + return new Automaton.epsilon + end +end + redef class Nre_and - redef fun make_rfa + redef fun make_nfa do - var a = children[0].make_rfa + var a = children[0].make_nfa var ta = new Token("1") a.tag_accept(ta) - var b = children[2].make_rfa + var b = children[2].make_nfa var tb = new Token("2") b.tag_accept(tb) @@ -125,18 +141,18 @@ redef class Nre_and end redef class Nre_except - redef fun make_rfa + redef fun make_nfa do - var a = children[0].make_rfa - var b = children[2].make_rfa + var a = children[0].make_nfa + var b = children[2].make_nfa return a.except(b) end end redef class Nre_shortest - redef fun make_rfa + redef fun make_nfa do - var a = children[2].make_rfa + var a = children[2].make_nfa a = a.to_dfa for s in a.accept do for t in s.outs.to_a do t.delete @@ -146,9 +162,9 @@ redef class Nre_shortest end redef class Nre_longest - redef fun make_rfa + redef fun make_nfa do - var a = children[2].make_rfa + var a = children[2].make_nfa a = a.to_dfa for s in a.accept.to_a do if not s.outs.is_empty then a.accept.remove(s) @@ -157,67 +173,91 @@ redef class Nre_longest end end +redef class Nre_prefixes + redef fun make_nfa + do + var a = children[2].make_nfa + a.trim + a.accept.add_all a.states + return a + end +end + redef class Nre_conc - redef fun make_rfa + redef fun make_nfa do - var a = children[0].make_rfa - var b = children[1].make_rfa + var a = children[0].make_nfa + var b = children[1].make_nfa a.concat(b) return a end end redef class Nre_star - redef fun make_rfa + redef fun make_nfa do - var a = children[0].make_rfa + var a = children[0].make_nfa a.close return a end end redef class Nre_ques - redef fun make_rfa + redef fun make_nfa do - var a = children[0].make_rfa + var a = children[0].make_nfa a.optionnal return a end end redef class Nre_plus - redef fun make_rfa + redef fun make_nfa do - var a = children[0].make_rfa + var a = children[0].make_nfa a.plus return a end end redef class Nre_par - redef fun make_rfa + redef fun make_nfa do - return children[1].make_rfa + return children[1].make_nfa end end redef class Nre_class - redef fun make_rfa: Automaton + redef fun make_nfa do var c1 = children[0].children[0].value var c2 = children[3].children[0].value if c1.length != 1 or c2.length != 1 then - print "Classes only works on single char" + print "Classes expect a single char" + exit(1) + abort + end + var a = new Automaton.cla(c1.chars.first.code_point, c2.chars.first.code_point) + return a + end +end + +redef class Nre_openclass + redef fun make_nfa + do + var c1 = children[0].children[0].value + if c1.length != 1 then + print "Classes expect a single char" exit(1) abort end - var a = new Automaton.cla(c1.chars.first.ascii, c2.chars.first.ascii) + var a = new Automaton.cla(c1.chars.first.code_point, null) return a end end redef class Nre_any - redef fun make_rfa: Automaton + redef fun make_nfa do var a = new Automaton.cla(0, null) return a