diff options
author | Adrian Thurston <thurston@complang.org> | 2013-06-09 15:24:12 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2013-06-09 15:24:12 -0400 |
commit | d36ff7472dbdb1be2b58cdfc95a88dc26817f9e8 (patch) | |
tree | 0ad6b0c7ba2a30b3fb2119c6ffdaac029a3c8e69 | |
parent | e8d3bfcb4e675461cbe245e908697d175eb87d56 (diff) | |
download | colm-d36ff7472dbdb1be2b58cdfc95a88dc26817f9e8.tar.gz |
more use of prod name switch statements
-rw-r--r-- | src/colm.lm | 64 | ||||
-rw-r--r-- | src/loadcolm.cc | 165 | ||||
-rw-r--r-- | src/parser.cc | 2 | ||||
-rw-r--r-- | src/parser.h | 2 |
4 files changed, 132 insertions, 101 deletions
diff --git a/src/colm.lm b/src/colm.lm index 8bef24d8..fcc89f3d 100644 --- a/src/colm.lm +++ b/src/colm.lm @@ -321,11 +321,11 @@ def token_def OptTranslate: opt_translate] def opt_translate - [COPEN LangStmtList: lang_stmt_list CCLOSE] + [COPEN LangStmtList: lang_stmt_list CCLOSE] :Translate | [] def opt_id - [Id: id] + [Id: id] :Id | [] def ignore_def @@ -367,18 +367,18 @@ def prod_list | [Prod: prod] def statement - [Print: print_stmt] -| [Expr: expr_stmt] -| [VarDef: var_def OptDefInit: opt_def_init] + [Print: print_stmt] :Print +| [Expr: expr_stmt] :Expr +| [VarDef: var_def OptDefInit: opt_def_init] :VarDef | [FOR ForDecl: id COLON TypeRef: type_ref IN IterCall: iter_call - BlockOrSingle: block_or_single] -| [IF IfExpr: code_expr BlockOrSingle: block_or_single ElsifList: elsif_list] -| [WHILE WhileExpr: code_expr BlockOrSingle: block_or_single] -| [LhsVarRef: var_ref EQUALS CodeExpr: code_expr] -| [YIELD YieldVarRef: var_ref] -| [RETURN ReturnExpr: code_expr] -| [Break: BREAK] -| [Reject: REJECT] + BlockOrSingle: block_or_single] :For +| [IF IfExpr: code_expr BlockOrSingle: block_or_single ElsifList: elsif_list] :If +| [WHILE WhileExpr: code_expr BlockOrSingle: block_or_single] :While +| [LhsVarRef: var_ref EQUALS CodeExpr: code_expr] :LhsVarRef +| [YIELD YieldVarRef: var_ref] :Yield +| [RETURN ReturnExpr: code_expr] :Return +| [Break: BREAK] :Break +| [Reject: REJECT] :Reject def elsif_list [ElsifClause: elsif_clause ElsifList: elsif_list] :Clause @@ -427,9 +427,9 @@ def expr_stmt [CodeExpr: code_expr] def code_expr - [Expr: code_expr AmpAmp: AMPAMP Relational: code_relational] -| [Expr: code_expr BarBar: BARBAR Relational: code_relational] -| [Relational: code_relational] + [Expr: code_expr AmpAmp: AMPAMP Relational: code_relational] :AmpAmp +| [Expr: code_expr BarBar: BARBAR Relational: code_relational] :BarBar +| [Relational: code_relational] :Base def code_relational [Relational: code_relational EQEQ Additive: code_additive] :EqEq @@ -446,9 +446,9 @@ def code_additive | [Multiplicitive: code_multiplicitive] :Base def code_multiplicitive - [Multiplicitive: code_multiplicitive Star: STAR Unary: code_unary] -| [Multiplicitive: code_multiplicitive Fslash: FSLASH Unary: code_unary] -| [Unary: code_unary] + [Multiplicitive: code_multiplicitive Star: STAR Unary: code_unary] :Star +| [Multiplicitive: code_multiplicitive Fslash: FSLASH Unary: code_unary] :Fslash +| [Unary: code_unary] :Base def code_unary [Bang: BANG Factor: code_factor] :Bang @@ -521,7 +521,7 @@ def field_init # def opt_label - [Id: id COLON] + [Id: id COLON] :Id | [] def dq_lit_term @@ -532,26 +532,26 @@ def opt_tilde_data | [] def pattern_el_lel - [RegionQual: region_qual Id: id OptRepeat: opt_repeat] -| [RegionQual: region_qual Lit: lit OptRepeat: opt_repeat] + [RegionQual: region_qual Id: id OptRepeat: opt_repeat] :Id +| [RegionQual: region_qual Lit: lit OptRepeat: opt_repeat] :Lit def pattern_el - [OptLabel: opt_label TypeOrLit: pattern_el_lel] -| [DQ LitpatElList: litpat_el* Term: dq_lit_term] -| [TILDE TildeData: opt_tilde_data Nl: TILDE_NL] + [OptLabel: opt_label TypeOrLit: pattern_el_lel] :PatternEl +| [DQ LitpatElList: litpat_el* Term: dq_lit_term] :Dq +| [TILDE TildeData: opt_tilde_data Nl: TILDE_NL] :Tilde def litpat_el - [ConsData: cons_data] -| [CONS_SQOPEN PatternElList: pattern_el* CONS_SQCLOSE] + [ConsData: cons_data] :ConsData +| [CONS_SQOPEN PatternElList: pattern_el* CONS_SQCLOSE] :SubList def pattern_top_el - [DQ LitpatElList: litpat_el* Term: dq_lit_term] -| [TILDE TildeData: opt_tilde_data Nl: TILDE_NL] -| [SQOPEN PatternElList: pattern_el* SQCLOSE] + [DQ LitpatElList: litpat_el* Term: dq_lit_term] :Dq +| [TILDE TildeData: opt_tilde_data Nl: TILDE_NL] :Tilde +| [SQOPEN PatternElList: pattern_el* SQCLOSE] :SubList def pattern_list - [PatternList: pattern_list PatternTopEl: pattern_top_el] -| [PatternTopEl: pattern_top_el] + [PatternList: pattern_list PatternTopEl: pattern_top_el] :List +| [PatternTopEl: pattern_top_el] :Base def pattern [PatternList: pattern_list] diff --git a/src/loadcolm.cc b/src/loadcolm.cc index d80a0221..cc148ce9 100644 --- a/src/loadcolm.cc +++ b/src/loadcolm.cc @@ -174,46 +174,51 @@ struct LoadColm LangExpr *walkCodeExpr( code_expr codeExpr ) { LangExpr *expr = 0; - if ( codeExpr.Expr() != 0 ) { - LangExpr *left = walkCodeExpr( codeExpr.Expr() ); - LangExpr *right = walkCodeRelational( codeExpr.Relational() ); + LangExpr *relational = walkCodeRelational( codeExpr.Relational() ); - char type = -1; - InputLoc loc; - if ( codeExpr.BarBar() != 0 ) { - type = OP_LogicalOr; - loc = codeExpr.BarBar().loc(); - } - else if ( codeExpr.AmpAmp() != 0 ) { - type = OP_LogicalAnd; - loc = codeExpr.AmpAmp().loc(); - } + switch ( codeExpr.prodName() ) { + case code_expr::_AmpAmp: { + LangExpr *left = walkCodeExpr( codeExpr.Expr() ); - expr = LangExpr::cons( loc, left, type, right ); + InputLoc loc = codeExpr.AmpAmp().loc(); + expr = LangExpr::cons( loc, left, OP_LogicalAnd, relational ); + break; } - else { - expr = walkCodeRelational( codeExpr.Relational() ); + case code_expr::_BarBar: { + LangExpr *left = walkCodeExpr( codeExpr.Expr() ); + + InputLoc loc = codeExpr.BarBar().loc(); + expr = LangExpr::cons( loc, left, OP_LogicalOr, relational ); + break; } + case code_expr::_Base: { + expr = relational; + break; + }} return expr; } LangStmt *walkStatement( statement Statement ) { LangStmt *stmt = 0; - if ( Statement.Print() != 0 ) { + switch ( Statement.prodName() ) { + case statement::_Print: { print_stmt printStmt = Statement.Print(); stmt = walkPrintStmt( printStmt ); + break; } - else if ( Statement.Expr() != 0 ) { + case statement::_Expr: { expr_stmt exprStmt = Statement.Expr(); stmt = walkExprStmt( exprStmt ); + break; } - else if ( Statement.VarDef() != 0 ) { + case statement::_VarDef: { ObjectField *objField = walkVarDef( Statement.VarDef() ); LangExpr *expr = walkOptDefInit( Statement.OptDefInit() ); stmt = varDef( objField, expr, LangStmt::AssignType ); + break; } - else if ( Statement.ForDecl() != 0 ) { + case statement::_For: { pushScope(); String forDecl = Statement.ForDecl().text().c_str(); @@ -225,8 +230,9 @@ struct LoadColm stmt = forScope( Statement.ForDecl().loc(), forDecl, typeRef, iterCall, stmtList ); popScope(); + break; } - else if ( Statement.IfExpr() != 0 ) { + case statement::_If: { pushScope(); LangExpr *expr = walkCodeExpr( Statement.IfExpr() ); @@ -236,34 +242,40 @@ struct LoadColm LangStmt *elsifList = walkElsifList( Statement.ElsifList() ); stmt = LangStmt::cons( LangStmt::IfType, expr, stmtList, elsifList ); - + break; } - else if ( Statement.WhileExpr() != 0 ) { + case statement::_While: { pushScope(); LangExpr *expr = walkCodeExpr( Statement.WhileExpr() ); StmtList *stmtList = walkBlockOrSingle( Statement.BlockOrSingle() ); stmt = LangStmt::cons( LangStmt::WhileType, expr, stmtList ); popScope(); + break; } - else if ( Statement.LhsVarRef() != 0 ) { + case statement::_LhsVarRef: { LangVarRef *varRef = walkVarRef( Statement.LhsVarRef() ); LangExpr *expr = walkCodeExpr( Statement.CodeExpr() ); stmt = LangStmt::cons( varRef->loc, LangStmt::AssignType, varRef, expr ); + break; } - else if ( Statement.YieldVarRef() != 0 ) { + case statement::_Yield: { LangVarRef *varRef = walkVarRef( Statement.YieldVarRef() ); stmt = LangStmt::cons( LangStmt::YieldType, varRef ); + break; } - else if ( Statement.ReturnExpr() != 0 ) { + case statement::_Return: { LangExpr *expr = walkCodeExpr( Statement.ReturnExpr() ); stmt = LangStmt::cons( Statement.loc(), LangStmt::ReturnType, expr ); + break; } - else if ( Statement.Break() != 0 ) { + case statement::_Break: { stmt = LangStmt::cons( LangStmt::BreakType ); + break; } - else if ( Statement.Reject() != 0 ) { + case statement::_Reject: { stmt = LangStmt::cons( Statement.Reject().loc(), LangStmt::RejectType ); - } + break; + }} return stmt; } @@ -325,7 +337,7 @@ struct LoadColm String walkOptId( opt_id optId ) { String name = 0; - if ( optId.Id() != 0 ) + if ( optId.prodName() == opt_id::_Id ) name = optId.Id().text().c_str(); return name; } @@ -369,20 +381,22 @@ struct LoadColm LangExpr *walkCodeMultiplicitive( code_multiplicitive mult ) { LangExpr *expr = 0; - if ( mult.Multiplicitive() != 0 ) { + LangExpr *right = walkCodeUnary( mult.Unary() ); + switch ( mult.prodName() ) { + case code_multiplicitive::_Star: { LangExpr *left = walkCodeMultiplicitive( mult.Multiplicitive() ); - LangExpr *right = walkCodeUnary( mult.Unary() ); - - if ( mult.Star() != 0 ) { - expr = LangExpr::cons( mult.Star().loc(), left, '*', right ); - } - else if ( mult.Fslash() != 0 ) { - expr = LangExpr::cons( mult.Fslash().loc(), left, '/', right ); - } + expr = LangExpr::cons( mult.Star().loc(), left, '*', right ); + break; } - else { - expr = walkCodeUnary( mult.Unary() ); + case code_multiplicitive::_Fslash: { + LangExpr *left = walkCodeMultiplicitive( mult.Multiplicitive() ); + expr = LangExpr::cons( mult.Fslash().loc(), left, '/', right ); + break; } + case code_multiplicitive::_Base: { + expr = right; + break; + }} return expr; } @@ -392,60 +406,70 @@ struct LoadColm RepeatType repeatType = walkOptRepeat( typeOrLit.OptRepeat() ); PatternItemList *list = 0; - if ( typeOrLit.Id() != 0 ) { + switch ( typeOrLit.prodName() ) { + case pattern_el_lel::_Id: { String id = typeOrLit.Id().text().c_str(); list = patternElNamed( typeOrLit.Id().loc(), nspaceQual, id, repeatType ); + break; } - else if ( typeOrLit.Lit() != 0 ) { + case pattern_el_lel::_Lit: { String lit = typeOrLit.Lit().text().c_str(); list = patternElType( typeOrLit.Lit().loc(), nspaceQual, lit, repeatType ); - } + break; + }} return list; } LangVarRef *walkOptLabel( opt_label optLabel ) { LangVarRef *varRef = 0; - if ( optLabel.Id() != 0 ) { + if ( optLabel.prodName() == opt_label::_Id ) { String id = optLabel.Id().text().c_str(); varRef = LangVarRef::cons( optLabel.Id().loc(), id ); } return varRef; } - PatternItemList *walkPatternEl( pattern_el PatternEl ) + PatternItemList *walkPatternEl( pattern_el patternEl ) { PatternItemList *list = 0; - if ( PatternEl.LitpatElList() != 0 ) { - list = walkLitpatElList( PatternEl.LitpatElList(), PatternEl.Term().Nl() ); + switch ( patternEl.prodName() ) { + case pattern_el::_Dq: { + list = walkLitpatElList( patternEl.LitpatElList(), patternEl.Term().Nl() ); + break; } - else if ( PatternEl.TildeData() != 0 ) { - String patternData = PatternEl.TildeData().text().c_str(); + case pattern_el::_Tilde: { + String patternData = patternEl.TildeData().text().c_str(); patternData += '\n'; - PatternItem *patternItem = PatternItem::cons( PatternEl.TildeData().loc(), + PatternItem *patternItem = PatternItem::cons( patternEl.TildeData().loc(), patternData, PatternItem::InputText ); list = PatternItemList::cons( patternItem ); + break; } - else if ( PatternEl.OptLabel() != 0 ) { - LangVarRef *varRef = walkOptLabel( PatternEl.OptLabel() ); - PatternItemList *typeOrLitList = walkPatternElTypeOrLit( PatternEl.TypeOrLit() ); - list = patternEl( varRef, typeOrLitList ); - } + case pattern_el::_PatternEl: { + LangVarRef *varRef = walkOptLabel( patternEl.OptLabel() ); + PatternItemList *typeOrLitList = walkPatternElTypeOrLit( patternEl.TypeOrLit() ); + list = consPatternEl( varRef, typeOrLitList ); + break; + }} return list; } PatternItemList *walkLitpatEl( litpat_el litpatEl ) { PatternItemList *list = 0; - if ( litpatEl.ConsData() != 0 ) { + switch ( litpatEl.prodName() ) { + case litpat_el::_ConsData: { String consData = unescape( litpatEl.ConsData().text().c_str() ); PatternItem *patternItem = PatternItem::cons( litpatEl.ConsData().loc(), consData, PatternItem::InputText ); list = PatternItemList::cons( patternItem ); + break; } - else if ( litpatEl.PatternElList() != 0 ) { + case litpat_el::_SubList: { list = walkPatternElList( litpatEl.PatternElList() ); - } + break; + }} return list; } @@ -482,33 +506,40 @@ struct LoadColm PatternItemList *walkPattternTopEl( pattern_top_el patternTopEl ) { PatternItemList *list = 0; - if ( patternTopEl.LitpatElList() != 0 ) { + switch ( patternTopEl.prodName() ) { + case pattern_top_el::_Dq: { list = walkLitpatElList( patternTopEl.LitpatElList(), patternTopEl.Term().Nl() ); + break; } - else if ( patternTopEl.TildeData() != 0 ) { + case pattern_top_el::_Tilde: { String patternData = patternTopEl.TildeData().text().c_str(); patternData += '\n'; PatternItem *patternItem = PatternItem::cons( patternTopEl.TildeData().loc(), patternData, PatternItem::InputText ); list = PatternItemList::cons( patternItem ); + break; } - else if ( patternTopEl.PatternElList() != 0 ) { + case pattern_top_el::_SubList: { list = walkPatternElList( patternTopEl.PatternElList() ); - } + break; + }} return list; } PatternItemList *walkPatternList( pattern_list patternList ) { PatternItemList *list = 0; - if ( patternList.PatternList() ) { + switch ( patternList.prodName() ) { + case pattern_list::_List: { PatternItemList *left = walkPatternList( patternList.PatternList() ); PatternItemList *right = walkPattternTopEl( patternList.PatternTopEl() ); list = patListConcat( left, right ); + break; } - else { + case pattern_list::_Base: { list = walkPattternTopEl( patternList.PatternTopEl() ); - } + break; + }} return list; } @@ -551,7 +582,7 @@ struct LoadColm CodeBlock *walkOptTranslate( opt_translate optTranslate ) { CodeBlock *block = 0; - if ( optTranslate.LangStmtList() != 0 ) { + if ( optTranslate.prodName() == opt_translate::_Translate ) { ObjectDef *localFrame = blockOpen(); StmtList *stmtList = walkLangStmtList( optTranslate.LangStmtList() ); block = CodeBlock::cons( stmtList, localFrame ); diff --git a/src/parser.cc b/src/parser.cc index 23a16e7f..0df1482d 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -582,7 +582,7 @@ LangExpr *BaseParser::parseCmd( const InputLoc &loc, bool stop, ObjectField *obj return expr; } -PatternItemList *BaseParser::patternEl( LangVarRef *varRef, PatternItemList *list ) +PatternItemList *BaseParser::consPatternEl( LangVarRef *varRef, PatternItemList *list ) { /* Store the variable reference in the pattern itemm. */ list->head->varRef = varRef; diff --git a/src/parser.h b/src/parser.h index 10b995bf..ada56d31 100644 --- a/src/parser.h +++ b/src/parser.h @@ -88,7 +88,7 @@ struct BaseParser LangExpr *send( const InputLoc &loc, LangVarRef *varRef, ConsItemList *list, bool eof ); LangExpr *parseCmd( const InputLoc &loc, bool stop, ObjectField *objField, TypeRef *typeRef, FieldInitVect *fieldInitVect, ConsItemList *list ); - PatternItemList *patternEl( LangVarRef *varRef, PatternItemList *list ); + PatternItemList *consPatternEl( LangVarRef *varRef, PatternItemList *list ); PatternItemList *patternElNamed( const InputLoc &loc, NamespaceQual *nspaceQual, const String &data, RepeatType repeatType ); PatternItemList *patternElType( const InputLoc &loc, |