nitcc: classes and elements allow any forms of text
authorJean Privat <jean@pryen.org>
Thu, 31 Oct 2013 15:12:45 +0000 (11:12 -0400)
committerJean Privat <jean@pryen.org>
Thu, 31 Oct 2013 15:12:45 +0000 (11:12 -0400)
Signed-off-by: Jean Privat <jean@pryen.org>

contrib/nitcc/src/nitcc.sablecc
contrib/nitcc/src/nitcc_parser_gen.nit
contrib/nitcc/src/nitcc_semantic.nit
contrib/nitcc/src/re2nfa.nit
contrib/nitcc/tests/sav/text.input1.res [new file with mode: 0644]
contrib/nitcc/tests/text.input1 [new file with mode: 0644]
contrib/nitcc/tests/text.sablecc [new file with mode: 0644]

index 63c77ff..f4e8b82 100644 (file)
@@ -62,12 +62,14 @@ re3 {-> re} =
        {shortest:} 'Shortest' '(' re ')' |
        {longest:} 'Longest' '(' re ')' |
        {id:} id |
-       {str:} str |
        {par:} '(' re ')' |
-       {class:} str '.' '.' str |
+       {class:} text '.' '.' text |
        {any:} 'Any' |
-       {ch_dec:} ch_dec ;
+       {text:} text ;
 
+text {-> re} =
+       {str:} str |
+       {ch_dec:} ch_dec ;
 
 parser_part = 'Parser' ign? rej? prod*;
 
@@ -98,7 +100,7 @@ elem_list =
 
 elem =
        {id:} id |
-       {str:} str |
+       {str:} text |
        {star:} elem '*' |
        {ques:} elem '?' |
        {plus:} elem '+' |
index cdc92ed..04172ae 100644 (file)
@@ -40,6 +40,7 @@ var p_re = new Production("re")
 var p_re1 = new Production("re1")
 var p_re2 = new Production("re2")
 var p_re3 = new Production("re3")
+var p_text = new Production("text")
 var p_par = new Production("parser")
 var p_ign = new Production("ignored")
 var p_rej = new Production("rejected")
@@ -53,7 +54,7 @@ var p_altid = new Production("altident")
 var p_elems = new Production("elems")
 var p_elem_list = new Production("elem_list")
 var p_elem = new Production("elem")
-g.prods.add_all([p_gr, p_re, p_re1, p_re2, p_re3, p_lex, p_exprs, p_expr, p_par, p_ign, p_rej, p_prods, p_prod, p_ptrans_o, p_alts, p_alt, p_altid_o, p_altid, p_elems, p_elem_list, p_elem])
+g.prods.add_all([p_gr, p_re, p_re1, p_re2, p_re3, p_text, p_lex, p_exprs, p_expr, p_par, p_ign, p_rej, p_prods, p_prod, p_ptrans_o, p_alts, p_alt, p_altid_o, p_altid, p_elems, p_elem_list, p_elem])
 g.prods.add(new Production("atrans"))
 g.prods.add(new Production("elemid"))
 g.prods.add(new Production("nelem"))
@@ -133,11 +134,13 @@ p_re3.new_alt("re_plus", p_re3, t_plus)
 p_re3.new_alt("re_shortest", t_shortest, t_opar, p_re, t_cpar)
 p_re3.new_alt("re_longest", t_longest, t_opar, p_re, t_cpar)
 p_re3.new_alt("re_par", t_opar, p_re, t_cpar)
-p_re3.new_alt("re_str", t_str)
-p_re3.new_alt("re_ch_dec", t_ch_dec)
-p_re3.new_alt("re_class", t_str, t_dot, t_dot, t_str)
+p_re3.new_alt("re_class", p_text, t_dot, t_dot, p_text)
 p_re3.new_alt("re_any", t_any)
 p_re3.new_alt("re_id", t_id)
+p_re3.new_alt("re_text", p_text)
+
+p_text.new_alt("re_str", t_str)
+p_text.new_alt("re_ch_dec", t_ch_dec)
 
 p_par.new_alt("par", t_kw, p_ign, p_rej, p_prods)
 
@@ -170,7 +173,7 @@ p_elem_list.new_alt("elem_list_many", p_elem_list, t_comma, p_elem)
 p_elem_list.new_alt("elem_list_one", p_elem)
 
 p_elem.new_alt("elem_id", t_id)
-p_elem.new_alt("elem_str", t_str)
+p_elem.new_alt("elem_str", p_text)
 p_elem.new_alt("elem_par", t_opar, p_alts, t_cpar)
 p_elem.new_alt("elem_star", p_elem, t_star)
 p_elem.new_alt("elem_ques", p_elem, t_ques)
index 26df3e5..dd18071 100644 (file)
@@ -500,7 +500,7 @@ end
 
 redef class Nelem_str
        redef fun accept_check_name_visitor(v) do
-               var str = children.first.as(Nstr)
+               var str = children.first.children.first.as(NToken)
                var text = str.value
                var name = str.text
                var elem: nullable Element
index dc43daa..da66d9f 100644 (file)
@@ -24,11 +24,16 @@ redef class Node
                print inspect
                abort
        end
+
+       # The real value of the string
+       fun value: String do
+               print inspect
+               abort
+       end
 end
 
 redef class Nstr
-       # The real value of the string
-       fun value: String do return text.substring(1, text.length-2).unescape_nit
+       redef fun value: String do return text.substring(1, text.length-2).unescape_nit
        redef fun make_rfa: Automaton
        do
                var a = new Automaton.epsilon
@@ -42,8 +47,7 @@ redef class Nstr
 end
 
 redef class Nch_dec
-       # The real value of the char
-       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.ascii.to_s
        redef fun make_rfa: Automaton
        do
                var a = new Automaton.atom(self.value.first.ascii)
@@ -208,8 +212,8 @@ end
 redef class Nre_class
        redef fun make_rfa: Automaton
        do
-               var c1 = children[0].as(Nstr).value
-               var c2 = children[3].as(Nstr).value
+               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"
                        exit(1)
diff --git a/contrib/nitcc/tests/sav/text.input1.res b/contrib/nitcc/tests/sav/text.input1.res
new file mode 100644 (file)
index 0000000..925ca2c
--- /dev/null
@@ -0,0 +1,6 @@
+Start
+  p
+    n@(1:1-1:11)='0123456789'
+    'a'@(1:11-1:12)
+    #98@(1:12-1:13)='b'
+  Eof@(1:13-1:13)=''
diff --git a/contrib/nitcc/tests/text.input1 b/contrib/nitcc/tests/text.input1
new file mode 100644 (file)
index 0000000..9602986
--- /dev/null
@@ -0,0 +1 @@
+0123456789ab
\ No newline at end of file
diff --git a/contrib/nitcc/tests/text.sablecc b/contrib/nitcc/tests/text.sablecc
new file mode 100644 (file)
index 0000000..bf8e7f0
--- /dev/null
@@ -0,0 +1,10 @@
+Grammar text;
+
+Lexer
+
+d = '0' | #49 | '2'..'3' | #52..#53 | '6'..#55 | #56..'9' ;
+n = d+;
+
+Parser
+
+p = n 'a' #98;