diff options
author | Adrian Thurston <thurston@complang.org> | 2013-03-22 22:11:13 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2013-03-22 22:11:13 -0400 |
commit | 56a51921c90303d65fd8a4b3fee99240676d43dd (patch) | |
tree | 792f86f7359dac1f2b7b119fd84390452b7dfe8f | |
parent | 451bf1904630d951c679f68473b378317370383c (diff) | |
download | colm-56a51921c90303d65fd8a4b3fee99240676d43dd.tar.gz |
lots of work on constructors, strings, accums and patterns
-rw-r--r-- | colm/colm.lm | 99 | ||||
-rw-r--r-- | colm/load.cc | 354 | ||||
-rwxr-xr-x | test/combine.sh | 6 | ||||
-rw-r--r-- | test/matchex.exp | 2 | ||||
-rw-r--r-- | test/matchex.in | 3 | ||||
-rw-r--r-- | test/matchex.lm | 8 | ||||
-rw-r--r-- | test/repeat1.exp | 16 | ||||
-rw-r--r-- | test/repeat1.in | 1 | ||||
-rw-r--r-- | test/repeat1.lm | 20 | ||||
-rw-r--r-- | test/til.exp | 9 | ||||
-rw-r--r-- | test/til.in | 14 | ||||
-rw-r--r-- | test/til.lm | 26 |
12 files changed, 385 insertions, 173 deletions
diff --git a/colm/colm.lm b/colm/colm.lm index c6e27fb4..145963f7 100644 --- a/colm/colm.lm +++ b/colm/colm.lm @@ -11,6 +11,7 @@ lex token PRINT_XML_AC / 'print_xml_ac' / token PARSE / 'parse' / token CONS / 'construct' | 'cons' / + token MATCH / 'match' / token SEND / 'send' / token NAMESPACE / 'namespace' / token FOR / 'for' / @@ -47,7 +48,7 @@ lex '\'' . ( ^( '\'' | '\\' ) | '\\' . any )* . '\'' / - token DQ / '\"' / + token DQ / '\"' / ni token SQOPEN /'['/ token SQCLOSE /']'/ @@ -71,7 +72,7 @@ lex token BANG /'!'/ token DOLLAR /'$'/ token CARET /'^'/ - token PERCENT /'!'/ + token PERCENT /'%'/ token PLUS /'+'/ token MINUS /'-'/ @@ -81,11 +82,12 @@ end lex token CONS_TDQ / '\"' / + token CONS_NL / '\n' / token CONS_SQOPEN / '[' / token CONS_SQCLOSE / ']' / token cons_data - / ( ^( '\"' | '[' | ']' | '\\' ) | '\\' . any )+ / + / ( ^( '\n' | '\"' | '[' | ']' | '\\' ) | '\\' . any )+ / end lex @@ -217,17 +219,13 @@ def ignore_def [IGNORE FSLASH Expr: lex_expr LEX_FSLASH] def prod_el - [OptName: opt_prod_name Id: id OptRepeat: opt_prod_repeat] -| [OptName: opt_prod_name Lit: lit OptRepeat: opt_prod_repeat] + [OptName: opt_prod_name Id: id OptRepeat: opt_repeat] +| [OptName: opt_prod_name Lit: lit OptRepeat: opt_repeat] def opt_prod_name [Name: id COLON] | [] -def opt_prod_repeat - [Star: STAR] -| [] - def prod_el_list [ProdElList: prod_el_list ProdEl: prod_el] | [] @@ -328,6 +326,7 @@ def code_factor OptFieldInit: opt_field_init Accumulate: accumulate] | [Cons: CONS OptCapture: opt_capture TypeRef: type_ref OptFieldInit: opt_field_init Constructor: constructor] +| [MATCH MatchVarRef: var_ref Pattern: pattern] | [String: cstring] def type_ref @@ -360,43 +359,57 @@ def field_init [CodeExpr: code_expr] # -# String List +# Pattern # -def string_el -# ['"' lit_string_el* '"'] - [CodeExpr: code_expr] +def litpat_term + [CONS_TDQ] | [Nl: CONS_NL] -def lit_string_el +def pattern_el_type_or_lit + [RegionQual: region_qual Id: id OptRepeat: opt_repeat] +| [RegionQual: region_qual Lit: lit OptRepeat: opt_repeat] + +def opt_label + [Id: id COLON] +| [] + +def pattern_el + [DQ LitpatElList: litpat_el* Term: litpat_term] +| [OptLabel: opt_label TypeOrLit: pattern_el_type_or_lit] + +def litpat_el [ConsData: cons_data] -| [CONS_SQOPEN StringElList: string_el* CONS_SQCLOSE] +| [CONS_SQOPEN PatternElList: pattern_el* CONS_SQCLOSE] -def string_top_el - [DQ LitStringElList: lit_string_el* CONS_TDQ] -| [SQOPEN StringElList: string_el* SQOPEN] +def pattern_top_el + [DQ LitpatElList: litpat_el* Term: litpat_term] +| [SQOPEN PatternElList: pattern_el* SQCLOSE] -def string_list - [StringTopEl: string_top_el StringList: string_list] -| [StringTopEl: string_top_el] +def pattern_list + [PatternList: pattern_list PatternTopEl: pattern_top_el] +| [PatternTopEl: pattern_top_el] -def cstring - [StringList: string_list] +def pattern + [PatternList: pattern_list] # # Constructor List # +def lit_cons_term + [CONS_TDQ] | [Nl: CONS_NL] + def cons_el -# [region_qual TK_Literal] -#| ['"' lit_cons_el_list '"'] - [CodeExpr: code_expr] + [RegionQual: region_qual Lit: lit] +| [DQ LitConsElList: lit_cons_el* Term: lit_cons_term] +| [CodeExpr: code_expr] def lit_cons_el [ConsData: cons_data] -#| ['[' cons_el_list ']'] +| [CONS_SQOPEN ConsElList: cons_el* CONS_SQCLOSE] def cons_top_el - [DQ LitConsElList: lit_cons_el* CONS_TDQ] + [DQ LitConsElList: lit_cons_el* Term: lit_cons_term] | [SQOPEN ConsElList: cons_el* SQCLOSE] def cons_list @@ -407,19 +420,43 @@ def constructor [ConsList: cons_list] # +# String List +# + +def string_el + [DQ LitStringElList: lit_string_el* Term: lit_cons_term] +| [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] +| [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 # def accum_el [CodeExpr: code_expr] -#| ['"' lit_accum_el* '"'] +| [DQ LitAccumElList: lit_accum_el* Term: lit_cons_term] def lit_accum_el [ConsData: cons_data] -#| ['[' accum_el_list ']'] +| [CONS_SQOPEN AccumElList: accum_el* CONS_SQCLOSE] def accum_top_el - [DQ LitAccumElList: lit_accum_el* CONS_TDQ] + [DQ LitAccumElList: lit_accum_el* Term: lit_cons_term] | [SQOPEN AccumElList: accum_el* SQCLOSE] def accum_list diff --git a/colm/load.cc b/colm/load.cc index 4492f992..43b9a86e 100644 --- a/colm/load.cc +++ b/colm/load.cc @@ -35,6 +35,36 @@ extern RuntimeData main_runtimeData; +String unescape( const String &s ) +{ + String out( String::Fresh(), s.length() ); + char *d = out.data; + + for ( int i = 0; i < s.length(); ) { + if ( s[i] == '\\' ) { + switch ( s[i+1] ) { + case '0': *d++ = '\0'; break; + case 'a': *d++ = '\a'; break; + case 'b': *d++ = '\b'; break; + case 't': *d++ = '\t'; break; + case 'n': *d++ = '\n'; break; + case 'v': *d++ = '\v'; break; + case 'f': *d++ = '\f'; break; + case 'r': *d++ = '\r'; break; + default: *d++ = s[i+1]; break; + } + i += 2; + } + else { + *d++ = s[i]; + i += 1; + } + } + out.chop( d - out.data ); + return out; +} + + struct LoadSource : public BaseParser @@ -101,7 +131,7 @@ struct LoadSource FieldInitVect *walkOptFieldInit( opt_field_init optFieldInit ); ConsItemList *walkLitAccumEl( lit_accum_el litAccumEl ); - ConsItemList *walkLitAccumElList( _repeat_lit_accum_el litAccumElList ); + ConsItemList *walkLitAccumElList( _repeat_lit_accum_el litAccumElList, CONS_NL Nl ); ConsItemList *walkAccumTopEl( accum_top_el accumTopEl ); ConsItemList *walkAccumList( accum_list accumList ); ConsItemList *walkAccumulate( accumulate Accumulate ); @@ -112,6 +142,7 @@ struct LoadSource ConsItemList *walkLitConsEl( lit_cons_el litConsEl ); ConsItemList *walkLitConsElList( _repeat_lit_cons_el litConsElList ); + ConsItemList *walkLitConsElList( _repeat_lit_cons_el litConsElList, CONS_NL Nl ); ConsItemList *walkConsTopEl( cons_top_el consTopEl ); ConsItemList *walkConsList( cons_list consList ); ConsItemList *walkConstructor( constructor Constructor ); @@ -123,7 +154,7 @@ struct LoadSource LangExpr *walkCodeMultiplicitive( code_multiplicitive codeMultiplicitive ); ConsItemList *walkLitStringEl( lit_string_el litStringEl ); - ConsItemList *walkLitStringElList( _repeat_lit_string_el litStringElList ); + ConsItemList *walkLitStringElList( _repeat_lit_string_el litStringElList, CONS_NL Nl ); ConsItemList *walkStringTopEl( string_top_el stringTopEl ); ConsItemList *walkStringList( string_list stringList ); ConsItemList *walkString( cstring String ); @@ -135,45 +166,133 @@ struct LoadSource ObjectField *walkParamVarDef( param_var_def ParamVarDef ); ParameterList *walkParamVarDefList( _repeat_param_var_def ParamVarDefList ); void walkIterDef( iter_def IterDef ); -}; + PatternItemList *walkPatternElTypeOrLit( pattern_el_type_or_lit typeOrLit ) + { + NamespaceQual *nspaceQual = walkRegionQual( typeOrLit.RegionQual() ); + RepeatType repeatType = walkOptRepeat( typeOrLit.OptRepeat() ); -BaseParser *consLoadSource( Compiler *pd, const char *inputFileName ) -{ - return new LoadSource( pd, inputFileName ); -} + PatternItemList *list = 0; + if ( typeOrLit.Id() != 0 ) { + String id = typeOrLit.Id().text().c_str(); + list = patternElNamed( internal, nspaceQual, id, repeatType ); + } + else if ( typeOrLit.Lit() != 0 ) { + String lit = typeOrLit.Lit().text().c_str(); + list = patternElType( internal, nspaceQual, lit, repeatType ); + } + return list; + } + LangVarRef *walkOptLabel( opt_label optLabel ) + { + LangVarRef *varRef = 0; + if ( optLabel.Id() != 0 ) { + String id = optLabel.Id().text().c_str(); + varRef = LangVarRef::cons( internal, id ); + } + return varRef; + } -String unescape( const String &s ) -{ - String out( String::Fresh(), s.length() ); - char *d = out.data; + PatternItemList *walkPatternEl( pattern_el PatternEl ) + { + PatternItemList *list = 0; + if ( PatternEl.LitpatElList() != 0 ) { + list = walkLitpatElList( PatternEl.LitpatElList(), PatternEl.Term().Nl() ); + } + else if ( PatternEl.OptLabel() != 0 ) { + LangVarRef *varRef = walkOptLabel( PatternEl.OptLabel() ); + PatternItemList *typeOrLitList = walkPatternElTypeOrLit( PatternEl.TypeOrLit() ); + list = patternEl( varRef, typeOrLitList ); + } + return list; + } - for ( int i = 0; i < s.length(); ) { - if ( s[i] == '\\' ) { - switch ( s[i+1] ) { - case '0': *d++ = '\0'; break; - case 'a': *d++ = '\a'; break; - case 'b': *d++ = '\b'; break; - case 't': *d++ = '\t'; break; - case 'n': *d++ = '\n'; break; - case 'v': *d++ = '\v'; break; - case 'f': *d++ = '\f'; break; - case 'r': *d++ = '\r'; break; - default: *d++ = s[i+1]; break; - } - i += 2; + PatternItemList *walkLitpatEl( litpat_el litpatEl ) + { + PatternItemList *list = 0; + if ( litpatEl.ConsData() != 0 ) { + String consData = unescape( litpatEl.ConsData().text().c_str() ); + PatternItem *patternItem = PatternItem::cons( internal, consData, + PatternItem::InputText ); + list = PatternItemList::cons( patternItem ); + } + else if ( litpatEl.PatternElList() != 0 ) { + list = walkPatternElList( litpatEl.PatternElList() ); + } + return list; + } + + PatternItemList *walkLitpatElList( _repeat_litpat_el litpatElList, CONS_NL Nl ) + { + PatternItemList *list = new PatternItemList; + while ( !litpatElList.end() ) { + PatternItemList *tail = walkLitpatEl( litpatElList.value() ); + list = patListConcat( list, tail ); + litpatElList = litpatElList.next(); + } + + if ( Nl != 0 ) { + String nl = unescape( Nl.text().c_str() ); + PatternItem *patternItem = PatternItem::cons( internal, nl, PatternItem::InputText ); + PatternItemList *term = PatternItemList::cons( patternItem ); + list = patListConcat( list, term ); + } + + return list; + } + + PatternItemList *walkPatternElList( _repeat_pattern_el patternElList ) + { + PatternItemList *list = new PatternItemList; + while ( !patternElList.end() ) { + PatternItemList *tail = walkPatternEl( patternElList.value() ); + list = patListConcat( list, tail ); + patternElList = patternElList.next(); + } + return list; + } + + PatternItemList *walkPattternTopEl( pattern_top_el patternTopEl ) + { + PatternItemList *list = 0; + if ( patternTopEl.LitpatElList() != 0 ) { + list = walkLitpatElList( patternTopEl.LitpatElList(), patternTopEl.Term().Nl() ); + } + else if ( patternTopEl.PatternElList() != 0 ) { + list = walkPatternElList( patternTopEl.PatternElList() ); + } + return list; + } + + PatternItemList *walkPatternList( pattern_list patternList ) + { + PatternItemList *list = 0; + if ( patternList.PatternList() ) { + PatternItemList *left = walkPatternList( patternList.PatternList() ); + PatternItemList *right = walkPattternTopEl( patternList.PatternTopEl() ); + list = patListConcat( left, right ); } else { - *d++ = s[i]; - i += 1; + list = walkPattternTopEl( patternList.PatternTopEl() ); } + return list; } - out.chop( d - out.data ); - return out; + + PatternItemList *walkPattern( pattern Pattern ) + { + return walkPatternList( Pattern.PatternList() ); + } +}; + + +BaseParser *consLoadSource( Compiler *pd, const char *inputFileName ) +{ + return new LoadSource( pd, inputFileName ); } + NamespaceQual *LoadSource::walkRegionQual( region_qual regionQual ) { NamespaceQual *qual; @@ -245,7 +364,8 @@ StmtList *LoadSource::walkLangStmtList( lang_stmt_list langStmtList ) while ( !stmtList.end() ) { statement Statement = stmtList.value(); LangStmt *stmt = walkStatement( Statement ); - retList->append( stmt ); + if ( stmt != 0 ) + retList->append( stmt ); stmtList = stmtList.next(); } @@ -283,9 +403,7 @@ void LoadSource::walkProdElList( ProdElList *list, prod_el_list ProdElList ) captureField = ObjectField::cons( internal, 0, fieldName ); } - RepeatType repeatType = RepeatNone; - if ( El.OptRepeat().Star() != 0 ) - repeatType = RepeatRepeat; + RepeatType repeatType = walkOptRepeat( El.OptRepeat() ); if ( El.Id() != 0 ) { String typeName = El.Id().text().c_str(); @@ -617,159 +735,188 @@ ObjectField *walkOptCapture( opt_capture optCapture ) } /* - * String + * Constructor */ -ConsItemList *LoadSource::walkLitStringEl( lit_string_el litStringEl ) +ConsItemList *LoadSource::walkLitConsEl( lit_cons_el litConsEl ) { ConsItemList *list = 0; - if ( litStringEl.ConsData() != 0 ) { - String consData = unescape( litStringEl.ConsData().text().c_str() ); - ConsItem *stringItem = ConsItem::cons( internal, ConsItem::InputText, consData ); - list = ConsItemList::cons( stringItem ); + if ( litConsEl.ConsData() != 0 ) { + String consData = unescape( litConsEl.ConsData().text().c_str() ); + ConsItem *consItem = ConsItem::cons( internal, ConsItem::InputText, consData ); + list = ConsItemList::cons( consItem ); } - else if ( litStringEl.StringElList() != 0 ) { - list = walkStringElList( litStringEl.StringElList() ); + else if ( litConsEl.ConsElList() != 0 ) { + list = walkConsElList( litConsEl.ConsElList() ); } return list; } -ConsItemList *LoadSource::walkLitStringElList( _repeat_lit_string_el litStringElList ) +ConsItemList *LoadSource::walkLitConsElList( _repeat_lit_cons_el litConsElList, CONS_NL Nl ) { ConsItemList *list = new ConsItemList; - while ( !litStringElList.end() ) { - ConsItemList *extension = walkLitStringEl( litStringElList.value() ); + while ( !litConsElList.end() ) { + ConsItemList *extension = walkLitConsEl( litConsElList.value() ); list = consListConcat( list, extension ); - litStringElList = litStringElList.next(); + litConsElList = litConsElList.next(); + } + + if ( Nl != 0 ) { + String consData = unescape( Nl.text().c_str() ); + ConsItem *consItem = ConsItem::cons( internal, ConsItem::InputText, consData ); + ConsItemList *term = ConsItemList::cons( consItem ); + list = consListConcat( list, term ); } + return list; } -ConsItemList *LoadSource::walkStringEl( string_el stringEl ) +ConsItemList *LoadSource::walkConsEl( cons_el consEl ) { ConsItemList *list = 0; - if ( stringEl.CodeExpr() != 0 ) { - LangExpr *consExpr = walkCodeExpr( stringEl.CodeExpr() ); + if ( consEl.Lit() != 0 ) { + NamespaceQual *nspaceQual = walkRegionQual( consEl.RegionQual() ); + String lit = consEl.Lit().text().c_str(); + list = consElLiteral( internal, lit, nspaceQual ); + } + else if ( consEl.CodeExpr() != 0 ) { + LangExpr *consExpr = walkCodeExpr( consEl.CodeExpr() ); ConsItem *consItem = ConsItem::cons( internal, ConsItem::ExprType, consExpr ); list = ConsItemList::cons( consItem ); } + else if ( consEl.LitConsElList() != 0 ) { + list = walkLitConsElList( consEl.LitConsElList(), consEl.Term().Nl() ); + } return list; } -ConsItemList *LoadSource::walkStringElList( _repeat_string_el stringElList ) +ConsItemList *LoadSource::walkConsElList( _repeat_cons_el consElList ) { ConsItemList *list = new ConsItemList; - while ( !stringElList.end() ) { - ConsItemList *extension = walkStringEl( stringElList.value() ); + while ( !consElList.end() ) { + ConsItemList *extension = walkConsEl( consElList.value() ); list = consListConcat( list, extension ); - stringElList = stringElList.next(); + consElList = consElList.next(); } return list; } -ConsItemList *LoadSource::walkStringTopEl( string_top_el stringTopEl ) +ConsItemList *LoadSource::walkConsTopEl( cons_top_el consTopEl ) { ConsItemList *list = 0; - if ( stringTopEl.LitStringElList() != 0 ) - list = walkLitStringElList( stringTopEl.LitStringElList() ); - else if ( stringTopEl.StringElList() != 0 ) { - list = walkStringElList( stringTopEl.StringElList() ); + if ( consTopEl.LitConsElList() != 0 ) + list = walkLitConsElList( consTopEl.LitConsElList(), consTopEl.Term().Nl() ); + else if ( consTopEl.ConsElList() != 0 ) { + list = walkConsElList( consTopEl.ConsElList() ); } return list; } -ConsItemList *LoadSource::walkStringList( string_list stringList ) +ConsItemList *LoadSource::walkConsList( cons_list consList ) { - ConsItemList *list = walkStringTopEl( stringList.StringTopEl() ); + ConsItemList *list = walkConsTopEl( consList.ConsTopEl() ); - if ( stringList.StringList() != 0 ) { - ConsItemList *extension = walkStringList( stringList.StringList() ); + if ( consList.ConsList() != 0 ) { + ConsItemList *extension = walkConsList( consList.ConsList() ); consListConcat( list, extension ); } return list; } -ConsItemList *LoadSource::walkString( cstring String ) +ConsItemList *LoadSource::walkConstructor( constructor Constructor ) { - ConsItemList *list = walkStringList( String.StringList() ); + ConsItemList *list = walkConsList( Constructor.ConsList() ); return list; } /* - * Constructor + * String */ -ConsItemList *LoadSource::walkLitConsEl( lit_cons_el litConsEl ) +ConsItemList *LoadSource::walkLitStringEl( lit_string_el litStringEl ) { ConsItemList *list = 0; - if ( litConsEl.ConsData() != 0 ) { - String consData = unescape( litConsEl.ConsData().text().c_str() ); - ConsItem *consItem = ConsItem::cons( internal, ConsItem::InputText, consData ); - list = ConsItemList::cons( consItem ); + if ( litStringEl.ConsData() != 0 ) { + String consData = unescape( litStringEl.ConsData().text().c_str() ); + ConsItem *stringItem = ConsItem::cons( internal, ConsItem::InputText, consData ); + list = ConsItemList::cons( stringItem ); + } + else if ( litStringEl.StringElList() != 0 ) { + list = walkStringElList( litStringEl.StringElList() ); } return list; } -ConsItemList *LoadSource::walkLitConsElList( _repeat_lit_cons_el litConsElList ) +ConsItemList *LoadSource::walkLitStringElList( _repeat_lit_string_el litStringElList, CONS_NL Nl ) { ConsItemList *list = new ConsItemList; - while ( !litConsElList.end() ) { - ConsItemList *extension = walkLitConsEl( litConsElList.value() ); + while ( !litStringElList.end() ) { + ConsItemList *extension = walkLitStringEl( litStringElList.value() ); list = consListConcat( list, extension ); - litConsElList = litConsElList.next(); + litStringElList = litStringElList.next(); + } + + if ( Nl != 0 ) { + String consData = unescape( Nl.text().c_str() ); + ConsItem *consItem = ConsItem::cons( internal, ConsItem::InputText, consData ); + ConsItemList *term = ConsItemList::cons( consItem ); + list = consListConcat( list, term ); } return list; } -ConsItemList *LoadSource::walkConsEl( cons_el consEl ) +ConsItemList *LoadSource::walkStringEl( string_el stringEl ) { ConsItemList *list = 0; - if ( consEl.CodeExpr() != 0 ) { - LangExpr *consExpr = walkCodeExpr( consEl.CodeExpr() ); + if ( stringEl.LitStringElList() != 0 ) { + list = walkLitStringElList( stringEl.LitStringElList(), stringEl.Term().Nl() ); + } + else if ( stringEl.CodeExpr() != 0 ) { + LangExpr *consExpr = walkCodeExpr( stringEl.CodeExpr() ); ConsItem *consItem = ConsItem::cons( internal, ConsItem::ExprType, consExpr ); list = ConsItemList::cons( consItem ); } return list; } -ConsItemList *LoadSource::walkConsElList( _repeat_cons_el consElList ) +ConsItemList *LoadSource::walkStringElList( _repeat_string_el stringElList ) { ConsItemList *list = new ConsItemList; - while ( !consElList.end() ) { - ConsItemList *extension = walkConsEl( consElList.value() ); + while ( !stringElList.end() ) { + ConsItemList *extension = walkStringEl( stringElList.value() ); list = consListConcat( list, extension ); - consElList = consElList.next(); + stringElList = stringElList.next(); } return list; } -ConsItemList *LoadSource::walkConsTopEl( cons_top_el consTopEl ) +ConsItemList *LoadSource::walkStringTopEl( string_top_el stringTopEl ) { ConsItemList *list = 0; - if ( consTopEl.LitConsElList() != 0 ) - list = walkLitConsElList( consTopEl.LitConsElList() ); - else if ( consTopEl.ConsElList() != 0 ) { - list = walkConsElList( consTopEl.ConsElList() ); + if ( stringTopEl.LitStringElList() != 0 ) + list = walkLitStringElList( stringTopEl.LitStringElList(), stringTopEl.Term().Nl() ); + else if ( stringTopEl.StringElList() != 0 ) { + list = walkStringElList( stringTopEl.StringElList() ); } return list; } -ConsItemList *LoadSource::walkConsList( cons_list consList ) +ConsItemList *LoadSource::walkStringList( string_list stringList ) { - ConsItemList *list = walkConsTopEl( consList.ConsTopEl() ); + ConsItemList *list = walkStringTopEl( stringList.StringTopEl() ); - if ( consList.ConsList() != 0 ) { - ConsItemList *extension = walkConsList( consList.ConsList() ); + if ( stringList.StringList() != 0 ) { + ConsItemList *extension = walkStringList( stringList.StringList() ); consListConcat( list, extension ); } return list; } -ConsItemList *LoadSource::walkConstructor( constructor Constructor ) +ConsItemList *LoadSource::walkString( cstring String ) { - ConsItemList *list = walkConsList( Constructor.ConsList() ); + ConsItemList *list = walkStringList( String.StringList() ); return list; } @@ -785,10 +932,13 @@ ConsItemList *LoadSource::walkLitAccumEl( lit_accum_el litAccumEl ) ConsItem *consItem = ConsItem::cons( internal, ConsItem::InputText, consData ); list = ConsItemList::cons( consItem ); } + else if ( litAccumEl.AccumElList() != 0 ) { + list = walkAccumElList( litAccumEl.AccumElList() ); + } return list; } -ConsItemList *LoadSource::walkLitAccumElList( _repeat_lit_accum_el litAccumElList ) +ConsItemList *LoadSource::walkLitAccumElList( _repeat_lit_accum_el litAccumElList, CONS_NL Nl ) { ConsItemList *list = new ConsItemList; while ( !litAccumElList.end() ) { @@ -796,13 +946,24 @@ ConsItemList *LoadSource::walkLitAccumElList( _repeat_lit_accum_el litAccumElLis list = consListConcat( list, extension ); litAccumElList = litAccumElList.next(); } + + if ( Nl != 0 ) { + String consData = unescape( Nl.text().c_str() ); + ConsItem *consItem = ConsItem::cons( internal, ConsItem::InputText, consData ); + ConsItemList *term = ConsItemList::cons( consItem ); + list = consListConcat( list, term ); + } + return list; } ConsItemList *LoadSource::walkAccumEl( accum_el accumEl ) { ConsItemList *list = 0; - if ( accumEl.CodeExpr() != 0 ) { + if ( accumEl.LitAccumElList() != 0 ) { + list = walkLitAccumElList( accumEl.LitAccumElList(), accumEl.Term().Nl() ); + } + else if ( accumEl.CodeExpr() != 0 ) { LangExpr *accumExpr = walkCodeExpr( accumEl.CodeExpr() ); ConsItem *consItem = ConsItem::cons( internal, ConsItem::ExprType, accumExpr ); list = ConsItemList::cons( consItem ); @@ -825,7 +986,7 @@ ConsItemList *LoadSource::walkAccumTopEl( accum_top_el accumTopEl ) { ConsItemList *list = 0; if ( accumTopEl.LitAccumElList() != 0 ) - list = walkLitAccumElList( accumTopEl.LitAccumElList() ); + list = walkLitAccumElList( accumTopEl.LitAccumElList(), accumTopEl.Term().Nl() ); else if ( accumTopEl.AccumElList() != 0 ) { list = walkAccumElList( accumTopEl.AccumElList() ); } @@ -939,6 +1100,11 @@ LangExpr *LoadSource::walkCodeFactor( code_factor codeFactor ) ConsItemList *list = walkString( codeFactor.String() ); expr = LangExpr::cons( LangTerm::cons( internal, list ) ); } + else if ( codeFactor.MatchVarRef() != 0 ) { + LangVarRef *varRef = walkVarRef( codeFactor.MatchVarRef() ); + PatternItemList *list = walkPattern( codeFactor.Pattern() ); + expr = match( internal, varRef, list ); + } return expr; } diff --git a/test/combine.sh b/test/combine.sh index 5a454e2a..bcdb0cd3 100755 --- a/test/combine.sh +++ b/test/combine.sh @@ -10,19 +10,19 @@ for fn in $@; do if [ -f ${fn%.lm}.args ]; then echo '##### ARGS #####'; cat ${fn%.lm}.args - rm ${fn%.lm}.args + git rm ${fn%.lm}.args &>/dev/null fi if [ -f ${fn%.lm}.in ]; then echo '##### IN #####'; cat ${fn%.lm}.in - rm ${fn%.lm}.in + git rm ${fn%.lm}.in &>/dev/null fi if [ -f ${fn%.lm}.exp ]; then echo '##### EXP #####'; cat ${fn%.lm}.exp - rm ${fn%.lm}.exp + git rm ${fn%.lm}.exp &>/dev/null fi ) \ diff --git a/test/matchex.exp b/test/matchex.exp deleted file mode 100644 index 544d4d7e..00000000 --- a/test/matchex.exp +++ /dev/null @@ -1,2 +0,0 @@ -adrian -adrian diff --git a/test/matchex.in b/test/matchex.in deleted file mode 100644 index f458f2ad..00000000 --- a/test/matchex.in +++ /dev/null @@ -1,3 +0,0 @@ -<person name=adrian hometown=kingston> - <t1 foo=bar2 e=f></t2> -</person>
\ No newline at end of file diff --git a/test/matchex.lm b/test/matchex.lm index c8104299..9542f809 100644 --- a/test/matchex.lm +++ b/test/matchex.lm @@ -1,3 +1,4 @@ +##### LM ##### lex token id /[a-zA-Z_][a-zA-Z0-9_]*/ literal '=', '<', '>', '/' @@ -31,3 +32,10 @@ match Tag.tree "<person name=[Val2:id attr*]>[item*]</person>" print( ^Val1 '\n' ) print( ^Val2 '\n' ) +##### IN ##### +<person name=adrian hometown=kingston> + <t1 foo=bar2 e=f></t2> +</person> +##### EXP ##### +adrian +adrian diff --git a/test/repeat1.exp b/test/repeat1.exp deleted file mode 100644 index 2edf2ae5..00000000 --- a/test/repeat1.exp +++ /dev/null @@ -1,16 +0,0 @@ -a b ( c d ) e ( f g ) h i -b ( c d ) e ( f g ) h i -( c d ) e ( f g ) h i -e ( f g ) h i -( f g ) h i -h i -i - - -i -h i -( f g ) h i -e ( f g ) h i -( c d ) e ( f g ) h i -b ( c d ) e ( f g ) h i -a b ( c d ) e ( f g ) h i diff --git a/test/repeat1.in b/test/repeat1.in deleted file mode 100644 index 047cf9ea..00000000 --- a/test/repeat1.in +++ /dev/null @@ -1 +0,0 @@ -a b ( c d ) e ( f g ) h i diff --git a/test/repeat1.lm b/test/repeat1.lm index ddefaa1e..af6374d8 100644 --- a/test/repeat1.lm +++ b/test/repeat1.lm @@ -1,3 +1,4 @@ +##### LM ##### lex ignore /space+/ literal '*', '(', ')' @@ -20,3 +21,22 @@ for I: item* in repeat( ItemList ) for I: item* in rev_repeat( ItemList ) print( ^I '\n' ) +##### IN ##### +a b ( c d ) e ( f g ) h i +##### EXP ##### +a b ( c d ) e ( f g ) h i +b ( c d ) e ( f g ) h i +( c d ) e ( f g ) h i +e ( f g ) h i +( f g ) h i +h i +i + + +i +h i +( f g ) h i +e ( f g ) h i +( c d ) e ( f g ) h i +b ( c d ) e ( f g ) h i +a b ( c d ) e ( f g ) h i diff --git a/test/til.exp b/test/til.exp deleted file mode 100644 index ba455c25..00000000 --- a/test/til.exp +++ /dev/null @@ -1,9 +0,0 @@ - -var a; -a := 1; - -do - a := a + 1; - c := d; -while a = 10; -hi := there; diff --git a/test/til.in b/test/til.in deleted file mode 100644 index 19b7bb19..00000000 --- a/test/til.in +++ /dev/null @@ -1,14 +0,0 @@ - -var a; -a := 1; - -head: - -a := a + 1; -c := d; - -if a = 10 then - goto head; -end - -hi := there; diff --git a/test/til.lm b/test/til.lm index 615f203c..0f00f692 100644 --- a/test/til.lm +++ b/test/til.lm @@ -1,3 +1,4 @@ +##### LM ##### lex literal 'var', 'if', 'then', 'else', 'while', 'do', 'for', 'read', 'write', 'end', 'to', 'goto' @@ -166,3 +167,28 @@ for S: statement* in P } print( %P ) +##### IN ##### + +var a; +a := 1; + +head: + +a := a + 1; +c := d; + +if a = 10 then + goto head; +end + +hi := there; +##### EXP ##### + +var a; +a := 1; + +do + a := a + 1; + c := d; +while a = 10; +hi := there; |