From 1e2a40fe795af20a03bb70d0cfbe4d2186bef6eb Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Thu, 31 Oct 2013 11:12:45 -0400 Subject: [PATCH] nitcc: classes and elements allow any forms of text Signed-off-by: Jean Privat --- contrib/nitcc/src/nitcc.sablecc | 10 ++++++---- contrib/nitcc/src/nitcc_parser_gen.nit | 13 ++++++++----- contrib/nitcc/src/nitcc_semantic.nit | 2 +- contrib/nitcc/src/re2nfa.nit | 16 ++++++++++------ contrib/nitcc/tests/sav/text.input1.res | 6 ++++++ contrib/nitcc/tests/text.input1 | 1 + contrib/nitcc/tests/text.sablecc | 10 ++++++++++ 7 files changed, 42 insertions(+), 16 deletions(-) create mode 100644 contrib/nitcc/tests/sav/text.input1.res create mode 100644 contrib/nitcc/tests/text.input1 create mode 100644 contrib/nitcc/tests/text.sablecc diff --git a/contrib/nitcc/src/nitcc.sablecc b/contrib/nitcc/src/nitcc.sablecc index 63c77ff..f4e8b82 100644 --- a/contrib/nitcc/src/nitcc.sablecc +++ b/contrib/nitcc/src/nitcc.sablecc @@ -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 '+' | diff --git a/contrib/nitcc/src/nitcc_parser_gen.nit b/contrib/nitcc/src/nitcc_parser_gen.nit index cdc92ed..04172ae 100644 --- a/contrib/nitcc/src/nitcc_parser_gen.nit +++ b/contrib/nitcc/src/nitcc_parser_gen.nit @@ -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) diff --git a/contrib/nitcc/src/nitcc_semantic.nit b/contrib/nitcc/src/nitcc_semantic.nit index 26df3e5..dd18071 100644 --- a/contrib/nitcc/src/nitcc_semantic.nit +++ b/contrib/nitcc/src/nitcc_semantic.nit @@ -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 diff --git a/contrib/nitcc/src/re2nfa.nit b/contrib/nitcc/src/re2nfa.nit index dc43daa..da66d9f 100644 --- a/contrib/nitcc/src/re2nfa.nit +++ b/contrib/nitcc/src/re2nfa.nit @@ -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 index 0000000..925ca2c --- /dev/null +++ b/contrib/nitcc/tests/sav/text.input1.res @@ -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 index 0000000..9602986 --- /dev/null +++ b/contrib/nitcc/tests/text.input1 @@ -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 index 0000000..bf8e7f0 --- /dev/null +++ b/contrib/nitcc/tests/text.sablecc @@ -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; -- 1.7.9.5