summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2013-06-09 15:24:12 -0400
committerAdrian Thurston <thurston@complang.org>2013-06-09 15:24:12 -0400
commitd36ff7472dbdb1be2b58cdfc95a88dc26817f9e8 (patch)
tree0ad6b0c7ba2a30b3fb2119c6ffdaac029a3c8e69
parente8d3bfcb4e675461cbe245e908697d175eb87d56 (diff)
downloadcolm-d36ff7472dbdb1be2b58cdfc95a88dc26817f9e8.tar.gz
more use of prod name switch statements
-rw-r--r--src/colm.lm64
-rw-r--r--src/loadcolm.cc165
-rw-r--r--src/parser.cc2
-rw-r--r--src/parser.h2
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,