summaryrefslogtreecommitdiff
path: root/src/loadcolm.cc
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@colm.net>2018-03-11 14:12:02 -0400
committerAdrian Thurston <thurston@colm.net>2018-03-11 14:12:02 -0400
commita431f21841b71a843bcd8eafa5a38d9f7dfbe44b (patch)
tree9b21c445c029f36792e4c05b55d9ccec6560edc8 /src/loadcolm.cc
parent7369ea21f22431f7b8c6623328960dce2df89d45 (diff)
downloadcolm-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.cc29
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() );