summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2013-03-22 22:11:13 -0400
committerAdrian Thurston <thurston@complang.org>2013-03-22 22:11:13 -0400
commit56a51921c90303d65fd8a4b3fee99240676d43dd (patch)
tree792f86f7359dac1f2b7b119fd84390452b7dfe8f
parent451bf1904630d951c679f68473b378317370383c (diff)
downloadcolm-56a51921c90303d65fd8a4b3fee99240676d43dd.tar.gz
lots of work on constructors, strings, accums and patterns
-rw-r--r--colm/colm.lm99
-rw-r--r--colm/load.cc354
-rwxr-xr-xtest/combine.sh6
-rw-r--r--test/matchex.exp2
-rw-r--r--test/matchex.in3
-rw-r--r--test/matchex.lm8
-rw-r--r--test/repeat1.exp16
-rw-r--r--test/repeat1.in1
-rw-r--r--test/repeat1.lm20
-rw-r--r--test/til.exp9
-rw-r--r--test/til.in14
-rw-r--r--test/til.lm26
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;