X-Git-Url: http://nitlanguage.org diff --git a/contrib/nitcc/src/re2nfa.nit b/contrib/nitcc/src/re2nfa.nit index 1fa3cff..886eaea 100644 --- a/contrib/nitcc/src/re2nfa.nit +++ b/contrib/nitcc/src/re2nfa.nit @@ -37,9 +37,8 @@ redef class Nstr redef fun make_rfa: Automaton 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,19 +46,19 @@ 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 value: String do return text.substring_from(1).to_i.code_point.to_s redef fun make_rfa: Automaton 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 value: String do return text.substring_from(2).to_hex.code_point.to_s redef fun make_rfa: Automaton 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 @@ -89,8 +88,17 @@ redef class Nre_minus var b = children[2].make_rfa.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,6 +106,14 @@ redef class Nre_minus end end +redef class Nre_end + redef fun make_rfa + 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 do @@ -211,7 +227,7 @@ redef class Nre_class 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, c2.chars.first.code_point) return a end end