diff options
author | Adrian Thurston <thurston@colm.net> | 2018-03-11 14:12:02 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@colm.net> | 2018-03-11 14:12:02 -0400 |
commit | a431f21841b71a843bcd8eafa5a38d9f7dfbe44b (patch) | |
tree | 9b21c445c029f36792e4c05b55d9ccec6560edc8 /src/loadcolm.cc | |
parent | 7369ea21f22431f7b8c6623328960dce2df89d45 (diff) | |
download | colm-a431f21841b71a843bcd8eafa5a38d9f7dfbe44b.tar.gz |
allow a prod-name case clause to also have a pattern
Diffstat (limited to 'src/loadcolm.cc')
-rw-r--r-- | src/loadcolm.cc | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/src/loadcolm.cc b/src/loadcolm.cc index 7ded9661..06acf477 100644 --- a/src/loadcolm.cc +++ b/src/loadcolm.cc @@ -2201,15 +2201,26 @@ struct LoadColm LangExpr *expr = 0; - if ( CaseClause.prodName() == case_clause::Pattern ) { - /* A match pattern. */ - PatternItemList *list = walkPattern( CaseClause.pattern(), varRef ); - expr = match( CaseClause.loc(), varRef, list ); - } - else { - /* An identifier to be interpreted as a production name. */ - String prod = CaseClause.id().text().c_str(); - expr = prodCompare( CaseClause.loc(), varRef, prod ); + switch ( CaseClause.prodName() ) { + case case_clause::Pattern: { + /* A match pattern. */ + PatternItemList *list = walkPattern( CaseClause.pattern(), varRef ); + expr = match( CaseClause.loc(), varRef, list ); + break; + } + case case_clause::Id: { + /* An identifier to be interpreted as a production name. */ + String prod = CaseClause.id().text().c_str(); + expr = prodCompare( CaseClause.loc(), varRef, prod, 0 ); + break; + } + case case_clause::IdPat: { + String prod = CaseClause.id().text().c_str(); + PatternItemList *list = walkPattern( CaseClause.pattern(), varRef ); + LangExpr *matchExpr = match( CaseClause.loc(), varRef, list ); + expr = prodCompare( CaseClause.loc(), varRef, prod, matchExpr ); + break; + } } StmtList *stmtList = walkBlockOrSingle( CaseClause.block_or_single() ); |