From 34f3411dfe83ac97a2859c1bd0daf7cd239c2818 Mon Sep 17 00:00:00 2001 From: Adrian Thurston Date: Sat, 30 Mar 2013 10:12:47 -0400 Subject: revert "unified string and accumulate" Going to diverge string and accumulate after all. Can give accumulate the single lit syntax. This reverts commit 8e40a19fe788d8dc3ce8ad4475c545eadf1251ba. --- colm/colm.lm | 42 +++++++++++++++++------ colm/load.cc | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 138 insertions(+), 11 deletions(-) diff --git a/colm/colm.lm b/colm/colm.lm index 930fde49..37fb2531 100644 --- a/colm/colm.lm +++ b/colm/colm.lm @@ -463,7 +463,7 @@ def code_factor | [Cons: CONS OptCapture: opt_capture TypeRef: type_ref OptFieldInit: opt_field_init Constructor: constructor] | [MATCH MatchVarRef: var_ref Pattern: pattern] -| [String: accumulate] +| [String: cstring] | [TypeRef: type_ref IN InVarRef: var_ref] | [MAKE_TREE POPEN MakeTreeExprList: code_expr* PCLOSE] | [MAKE_TOKEN POPEN MakeTokenExprList: code_expr* PCLOSE] @@ -503,10 +503,6 @@ def field_init # Pattern # -def opt_tilde_data - [tilde_data] -| [] - def litpat_term [CONS_DQ] | [Nl: CONS_NL] @@ -521,7 +517,7 @@ def opt_label def pattern_el [OptLabel: opt_label TypeOrLit: pattern_el_lel] | [DQ LitpatElList: litpat_el* Term: litpat_term] -| [TILDE TildeData: opt_tilde_data Nl: TILDE_NL] +| [TILDE TildeData: tilde_data Nl: TILDE_NL] def litpat_el [ConsData: cons_data] @@ -568,6 +564,36 @@ def cons_list def constructor [ConsList: cons_list] +# +# String List +# + +def opt_tilde_data + [tilde_data] +| [] + +def string_el + [DQ LitStringElList: lit_string_el* Term: lit_cons_term] +| [TILDE TildeData: opt_tilde_data Nl: TILDE_NL] +| [CodeExpr: code_expr] + +def lit_string_el + [ConsData: cons_data] +| [CONS_SQOPEN StringElList: string_el* CONS_SQCLOSE] + +def string_top_el + [DQ LitStringElList: lit_string_el* Term: lit_cons_term] +| [TILDE TildeData: opt_tilde_data Nl: TILDE_NL] +| [SQOPEN StringElList: string_el* SQCLOSE] + +def string_list + [StringTopEl: string_top_el StringList: string_list] +| [StringTopEl: string_top_el] + +def cstring + [StringList: string_list] + + # # Accumulate # @@ -593,10 +619,6 @@ def accum_list def accumulate [AccumList: accum_list] -# -# VarRef -# - def var_ref [Qual: qual Id: id] diff --git a/colm/load.cc b/colm/load.cc index d58c58d5..f79babb4 100644 --- a/colm/load.cc +++ b/colm/load.cc @@ -1154,6 +1154,111 @@ struct LoadSource return list; } + /* + * String + */ + + ConsItemList *walkLitStringEl( lit_string_el litStringEl ) + { + ConsItemList *list = 0; + if ( litStringEl.ConsData() != 0 ) { + String consData = unescape( litStringEl.ConsData().text().c_str() ); + ConsItem *stringItem = ConsItem::cons( litStringEl.ConsData().loc(), + ConsItem::InputText, consData ); + list = ConsItemList::cons( stringItem ); + } + else if ( litStringEl.StringElList() != 0 ) { + list = walkStringElList( litStringEl.StringElList() ); + } + return list; + } + + ConsItemList *walkLitStringElList( _repeat_lit_string_el litStringElList, CONS_NL Nl ) + { + ConsItemList *list = new ConsItemList; + while ( !litStringElList.end() ) { + ConsItemList *extension = walkLitStringEl( litStringElList.value() ); + list = consListConcat( list, extension ); + litStringElList = litStringElList.next(); + } + + if ( Nl != 0 ) { + String consData = unescape( Nl.text().c_str() ); + ConsItem *consItem = ConsItem::cons( Nl.loc(), ConsItem::InputText, consData ); + ConsItemList *term = ConsItemList::cons( consItem ); + list = consListConcat( list, term ); + } + return list; + } + + ConsItemList *walkStringEl( string_el stringEl ) + { + ConsItemList *list = 0; + if ( stringEl.LitStringElList() != 0 ) { + list = walkLitStringElList( stringEl.LitStringElList(), stringEl.Term().Nl() ); + } + else if ( stringEl.TildeData() != 0 ) { + String consData = stringEl.TildeData().text().c_str(); + consData += '\n'; + ConsItem *consItem = ConsItem::cons( stringEl.TildeData().loc(), + ConsItem::InputText, consData ); + list = ConsItemList::cons( consItem ); + } + else if ( stringEl.CodeExpr() != 0 ) { + LangExpr *consExpr = walkCodeExpr( stringEl.CodeExpr() ); + ConsItem *consItem = ConsItem::cons( consExpr->loc, ConsItem::ExprType, consExpr ); + list = ConsItemList::cons( consItem ); + } + return list; + } + + ConsItemList *walkStringElList( _repeat_string_el stringElList ) + { + ConsItemList *list = new ConsItemList; + while ( !stringElList.end() ) { + ConsItemList *extension = walkStringEl( stringElList.value() ); + list = consListConcat( list, extension ); + stringElList = stringElList.next(); + } + return list; + } + + ConsItemList *walkStringTopEl( string_top_el stringTopEl ) + { + ConsItemList *list = 0; + if ( stringTopEl.LitStringElList() != 0 ) + list = walkLitStringElList( stringTopEl.LitStringElList(), stringTopEl.Term().Nl() ); + else if ( stringTopEl.TildeData() != 0 ) { + String consData = stringTopEl.TildeData().text().c_str(); + consData += '\n'; + ConsItem *consItem = ConsItem::cons( stringTopEl.TildeData().loc(), + ConsItem::InputText, consData ); + list = ConsItemList::cons( consItem ); + } + else if ( stringTopEl.StringElList() != 0 ) { + list = walkStringElList( stringTopEl.StringElList() ); + } + return list; + } + + ConsItemList *walkStringList( string_list stringList ) + { + ConsItemList *list = walkStringTopEl( stringList.StringTopEl() ); + + if ( stringList.StringList() != 0 ) { + ConsItemList *extension = walkStringList( stringList.StringList() ); + consListConcat( list, extension ); + } + + return list; + } + + ConsItemList *walkString( cstring String ) + { + ConsItemList *list = walkStringList( String.StringList() ); + return list; + } + /* * Accum */ @@ -1361,7 +1466,7 @@ struct LoadSource expr = walkCodeExpr( codeFactor.ParenCodeExpr() ); } else if ( codeFactor.String() != 0 ) { - ConsItemList *list = walkAccumulate( codeFactor.String() ); + ConsItemList *list = walkString( codeFactor.String() ); expr = LangExpr::cons( LangTerm::cons( codeFactor.String().loc(), list ) ); } else if ( codeFactor.MatchVarRef() != 0 ) { -- cgit v1.2.1