[pure-lang-svn] SF.net SVN: pure-lang: [403] pure/trunk
Status: Beta
Brought to you by:
agraef
From: <ag...@us...> - 2008-07-06 22:48:31
|
Revision: 403 http://pure-lang.svn.sourceforge.net/pure-lang/?rev=403&view=rev Author: agraef Date: 2008-07-06 15:48:40 -0700 (Sun, 06 Jul 2008) Log Message: ----------- Bugfix in pretty-printing. Modified Paths: -------------- pure/trunk/ChangeLog pure/trunk/printer.cc Modified: pure/trunk/ChangeLog =================================================================== --- pure/trunk/ChangeLog 2008-07-06 21:20:06 UTC (rev 402) +++ pure/trunk/ChangeLog 2008-07-06 22:48:40 UTC (rev 403) @@ -1,3 +1,8 @@ +2008-07-07 Albert Graef <Dr....@t-...> + + * printer.cc: Add missing parens around low-precedence elements in + proper lists. Reported by Jiri Spitz. + 2008-07-06 Albert Graef <Dr....@t-...> * lib/prelude.pure: Added new "mapsto" constructor. Requested by Modified: pure/trunk/printer.cc =================================================================== --- pure/trunk/printer.cc 2008-07-06 21:20:06 UTC (rev 402) +++ pure/trunk/printer.cc 2008-07-06 22:48:40 UTC (rev 403) @@ -250,11 +250,21 @@ prec_t p; if (x.is_list(xs)) { // proper list value + size_t n = xs.size(); os << "["; - for (exprl::const_iterator it = xs.begin(); it != xs.end(); ) { - printx(os, *it, pat); - if (++it != xs.end()) os << ","; - } + if (n>1) { + // list elements at a precedence not larger than ',' have to be + // parenthesized + p = sym_nprec(interpreter::g_interp->symtab.pair_sym().f) + 1; + for (exprl::const_iterator it = xs.begin(); it != xs.end(); ) { + os << paren(p, *it, pat); + if (++it != xs.end()) os << ","; + } + } else + for (exprl::const_iterator it = xs.begin(); it != xs.end(); ) { + printx(os, *it, pat); + if (++it != xs.end()) os << ","; + } return os << "]"; } else if (x.is_app(u, v)) { if (u.ftag() > 0 && (p = sym_nprec(u.ftag())) < 100 && p%10 >= 3) { @@ -669,12 +679,23 @@ prec_t p; if (pure_is_list(x, xs)) { // proper list value + size_t n = xs.size(); os << "["; - for (list<const pure_expr*>::const_iterator it = xs.begin(); - it != xs.end(); ) { - os << *it; - if (++it != xs.end()) os << ","; - } + if (n>1) { + // list elements at a precedence not larger than ',' have to be + // parenthesized + p = sym_nprec(interpreter::g_interp->symtab.pair_sym().f) + 1; + for (list<const pure_expr*>::const_iterator it = xs.begin(); + it != xs.end(); ) { + os << pure_paren(p, *it); + if (++it != xs.end()) os << ","; + } + } else + for (list<const pure_expr*>::const_iterator it = xs.begin(); + it != xs.end(); ) { + os << *it; + if (++it != xs.end()) os << ","; + } return os << "]"; } const pure_expr *u = x->data.x[0], *v = x->data.x[1], *w, *y; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |