diff options
author | Adrian Thurston <thurston@colm.net> | 2018-03-10 22:43:36 -0500 |
---|---|---|
committer | Adrian Thurston <thurston@colm.net> | 2018-03-10 22:43:36 -0500 |
commit | 7369ea21f22431f7b8c6623328960dce2df89d45 (patch) | |
tree | 368c7c2bc659af2ac1e662b17dab805d4f40f8d1 /src | |
parent | 2efdd395cd3b1cee4ee6cb00ec31c4d3e06df64c (diff) | |
download | colm-7369ea21f22431f7b8c6623328960dce2df89d45.tar.gz |
added a send statement without the send <id>
Added a bare send statement. This statement assumes availibility of send target
named 'Output'
Removed the expression statment to avoid ambiguity with factor string. Requires
copying some factor items to the statment.
Diffstat (limited to 'src')
-rw-r--r-- | src/colm.lm | 30 | ||||
-rw-r--r-- | src/loadcolm.cc | 285 |
2 files changed, 176 insertions, 139 deletions
diff --git a/src/colm.lm b/src/colm.lm index 47188910..e680a185 100644 --- a/src/colm.lm +++ b/src/colm.lm @@ -516,7 +516,6 @@ def case_clause_list def statement [print_stmt] :Print commit -| [expr_stmt] :Expr commit | [var_def opt_def_init] :VarDef commit | [FOR id COLON type_ref IN iter_call block_or_single] :For commit | [IF code_expr block_or_single elsif_list] :If commit @@ -528,6 +527,9 @@ def statement | [RETURN code_expr] :Return commit | [BREAK] :Break commit | [REJECT] :Reject commit +| [var_ref POPEN call_arg_list PCLOSE] :Call +| [stmt_or_factor] :StmtOrFactor +| [accumulate opt_eos] :BareSend def elsif_list [elsif_clause elsif_list] :Clause @@ -630,22 +632,11 @@ def code_factor | [TRUE] :True | [FALSE] :False | [POPEN code_expr PCLOSE] :Paren -| [SEND var_ref accumulate opt_eos] :Send -| [SEND_TREE var_ref accumulate opt_eos] :SendTree -| [PARSE opt_capture type_ref opt_field_init accumulate] :Parse -| [PARSE_TREE opt_capture type_ref opt_field_init accumulate] :ParseTree -| [PARSE_STOP opt_capture type_ref opt_field_init accumulate] :ParseStop -| [REDUCE id type_ref opt_field_init accumulate] :Reduce -| [READ_REDUCE id type_ref opt_field_init accumulate] :ReadReduce -| [CONS opt_capture type_ref opt_field_init constructor] :Cons -| [MATCH var_ref pattern] :Match | [string] :String | [type_ref IN var_ref] :In -| [MAKE_TREE POPEN call_arg_list PCLOSE] :MakeTree -| [MAKE_TOKEN POPEN call_arg_list PCLOSE] :MakeToken | [TYPEID LT type_ref GT] :TypeId -| [NEW opt_capture type_ref POPEN FieldInitList: field_init* PCLOSE] :New | [CAST LT type_ref GT code_factor] :Cast +| [stmt_or_factor] :StmtOrFactor def type_ref [region_qual id opt_repeat] :Id @@ -678,6 +669,19 @@ def opt_field_init def field_init [code_expr] +def stmt_or_factor + [PARSE opt_capture type_ref opt_field_init accumulate] :Parse +| [PARSE_TREE opt_capture type_ref opt_field_init accumulate] :ParseTree +| [PARSE_STOP opt_capture type_ref opt_field_init accumulate] :ParseStop +| [REDUCE id type_ref opt_field_init accumulate] :Reduce +| [READ_REDUCE id type_ref opt_field_init accumulate] :ReadReduce +| [SEND var_ref accumulate opt_eos] :Send +| [SEND_TREE var_ref accumulate opt_eos] :SendTree +| [MAKE_TREE POPEN call_arg_list PCLOSE] :MakeTree +| [MAKE_TOKEN POPEN call_arg_list PCLOSE] :MakeToken +| [CONS opt_capture type_ref opt_field_init constructor] :Cons +| [MATCH var_ref pattern] :Match +| [NEW opt_capture type_ref POPEN FieldInitList: field_init* PCLOSE] :New # # Pattern diff --git a/src/loadcolm.cc b/src/loadcolm.cc index 02c993a1..7ded9661 100644 --- a/src/loadcolm.cc +++ b/src/loadcolm.cc @@ -202,11 +202,6 @@ struct LoadColm stmt = walkPrintStmt( printStmt ); break; } - case statement::Expr: { - expr_stmt exprStmt = Statement.expr_stmt(); - stmt = walkExprStmt( exprStmt ); - break; - } case statement::VarDef: { ObjectField *objField = walkVarDef( Statement.var_def(), ObjectField::UserLocalType ); @@ -279,7 +274,34 @@ struct LoadColm case statement::Reject: { stmt = LangStmt::cons( Statement.REJECT().loc(), LangStmt::RejectType ); break; - }} + } + case statement::Call: { + LangVarRef *langVarRef = walkVarRef( Statement.var_ref() ); + CallArgVect *exprVect = walkCallArgList( Statement.call_arg_list() ); + LangTerm *term = LangTerm::cons( langVarRef->loc, langVarRef, exprVect ); + LangExpr *expr = LangExpr::cons( term ); + stmt = LangStmt::cons( expr->loc, LangStmt::ExprType, expr ); + break; + } + case statement::StmtOrFactor: { + LangExpr *expr = walkStmtOrFactor( Statement.stmt_or_factor() ); + stmt = LangStmt::cons( expr->loc, LangStmt::ExprType, expr ); + break; + } + case statement::BareSend: { + NamespaceQual *nspaceQual = NamespaceQual::cons( curNspace() ); + QualItemVect *qualItemVect = new QualItemVect; + String id = "Output"; + LangVarRef *varRef = LangVarRef::cons( InputLoc(), + curNspace(), curStruct(), curScope(), nspaceQual, qualItemVect, id ); + + ConsItemList *list = walkAccumulate( Statement.accumulate() ); + bool eof = walkOptEos( Statement.opt_eos() ); + LangExpr *expr = send( InputLoc(), varRef, list, eof ); + stmt = LangStmt::cons( expr->loc, LangStmt::ExprType, expr ); + break; + } + } return stmt; } @@ -1766,118 +1788,175 @@ struct LoadColm return list; } - LangExpr *walkCodeFactor( code_factor codeFactor, bool used = true ) + LangExpr *walkStmtOrFactor( stmt_or_factor StmtOrFactor ) { LangExpr *expr = 0; - switch ( codeFactor.prodName() ) { - case code_factor::VarRef: { - LangVarRef *langVarRef = walkVarRef( codeFactor.var_ref() ); - LangTerm *term = LangTerm::cons( langVarRef->loc, - LangTerm::VarRefType, langVarRef ); - expr = LangExpr::cons( term ); - break; - } - case code_factor::Call: { - LangVarRef *langVarRef = walkVarRef( codeFactor.var_ref() ); - CallArgVect *exprVect = walkCallArgList( codeFactor.call_arg_list() ); - LangTerm *term = LangTerm::cons( langVarRef->loc, langVarRef, exprVect ); - expr = LangExpr::cons( term ); - break; - } - case code_factor::Number: { - String number = codeFactor.number().text().c_str(); - LangTerm *term = LangTerm::cons( codeFactor.number().loc(), - LangTerm::NumberType, number ); - expr = LangExpr::cons( term ); - break; - } - case code_factor::Parse: { + switch ( StmtOrFactor.prodName() ) { + case stmt_or_factor::Parse: { /* The type we are parsing. */ - type_ref typeRefTree = codeFactor.type_ref(); + type_ref typeRefTree = StmtOrFactor.type_ref(); TypeRef *typeRef = walkTypeRef( typeRefTree ); - ObjectField *objField = walkOptCapture( codeFactor.opt_capture() ); - FieldInitVect *init = walkOptFieldInit( codeFactor.opt_field_init() ); - ConsItemList *list = walkAccumulate( codeFactor.accumulate() ); + ObjectField *objField = walkOptCapture( StmtOrFactor.opt_capture() ); + FieldInitVect *init = walkOptFieldInit( StmtOrFactor.opt_field_init() ); + ConsItemList *list = walkAccumulate( StmtOrFactor.accumulate() ); - expr = parseCmd( codeFactor.PARSE().loc(), false, false, objField, - typeRef, init, list, used, false, false, "" ); + expr = parseCmd( StmtOrFactor.PARSE().loc(), false, false, objField, + typeRef, init, list, true, false, false, "" ); break; } - case code_factor::ParseTree: { + case stmt_or_factor::ParseTree: { /* The type we are parsing. */ - type_ref typeRefTree = codeFactor.type_ref(); + type_ref typeRefTree = StmtOrFactor.type_ref(); TypeRef *typeRef = walkTypeRef( typeRefTree ); - ObjectField *objField = walkOptCapture( codeFactor.opt_capture() ); - FieldInitVect *init = walkOptFieldInit( codeFactor.opt_field_init() ); - ConsItemList *list = walkAccumulate( codeFactor.accumulate() ); + ObjectField *objField = walkOptCapture( StmtOrFactor.opt_capture() ); + FieldInitVect *init = walkOptFieldInit( StmtOrFactor.opt_field_init() ); + ConsItemList *list = walkAccumulate( StmtOrFactor.accumulate() ); - expr = parseCmd( codeFactor.PARSE_TREE().loc(), true, false, objField, - typeRef, init, list, used, false, false, "" ); + expr = parseCmd( StmtOrFactor.PARSE_TREE().loc(), true, false, objField, + typeRef, init, list, true, false, false, "" ); break; } - case code_factor::ParseStop: { + case stmt_or_factor::ParseStop: { /* The type we are parsing. */ - type_ref typeRefTree = codeFactor.type_ref(); + type_ref typeRefTree = StmtOrFactor.type_ref(); TypeRef *typeRef = walkTypeRef( typeRefTree ); - ObjectField *objField = walkOptCapture( codeFactor.opt_capture() ); - FieldInitVect *init = walkOptFieldInit( codeFactor.opt_field_init() ); - ConsItemList *list = walkAccumulate( codeFactor.accumulate() ); + ObjectField *objField = walkOptCapture( StmtOrFactor.opt_capture() ); + FieldInitVect *init = walkOptFieldInit( StmtOrFactor.opt_field_init() ); + ConsItemList *list = walkAccumulate( StmtOrFactor.accumulate() ); - expr = parseCmd( codeFactor.PARSE_STOP().loc(), false, true, objField, - typeRef, init, list, used, false, false, "" ); + expr = parseCmd( StmtOrFactor.PARSE_STOP().loc(), false, true, objField, + typeRef, init, list, true, false, false, "" ); break; } - case code_factor::Reduce: { + case stmt_or_factor::Reduce: { /* The reducer name. */ - String reducer = codeFactor.id().data(); + String reducer = StmtOrFactor.id().data(); /* The type we are parsing. */ - type_ref typeRefTree = codeFactor.type_ref(); + type_ref typeRefTree = StmtOrFactor.type_ref(); TypeRef *typeRef = walkTypeRef( typeRefTree ); - FieldInitVect *init = walkOptFieldInit( codeFactor.opt_field_init() ); - ConsItemList *list = walkAccumulate( codeFactor.accumulate() ); + FieldInitVect *init = walkOptFieldInit( StmtOrFactor.opt_field_init() ); + ConsItemList *list = walkAccumulate( StmtOrFactor.accumulate() ); - expr = parseCmd( codeFactor.REDUCE().loc(), false, false, 0, - typeRef, init, list, used, true, false, reducer ); + expr = parseCmd( StmtOrFactor.REDUCE().loc(), false, false, 0, + typeRef, init, list, true, true, false, reducer ); break; } - case code_factor::ReadReduce: { + case stmt_or_factor::ReadReduce: { /* The reducer name. */ - String reducer = codeFactor.id().data(); + String reducer = StmtOrFactor.id().data(); /* The type we are parsing. */ - type_ref typeRefTree = codeFactor.type_ref(); + type_ref typeRefTree = StmtOrFactor.type_ref(); TypeRef *typeRef = walkTypeRef( typeRefTree ); - FieldInitVect *init = walkOptFieldInit( codeFactor.opt_field_init() ); - ConsItemList *list = walkAccumulate( codeFactor.accumulate() ); + FieldInitVect *init = walkOptFieldInit( StmtOrFactor.opt_field_init() ); + ConsItemList *list = walkAccumulate( StmtOrFactor.accumulate() ); - expr = parseCmd( codeFactor.READ_REDUCE().loc(), false, false, 0, - typeRef, init, list, used, true, true, reducer ); + expr = parseCmd( StmtOrFactor.READ_REDUCE().loc(), false, false, 0, + typeRef, init, list, true, true, true, reducer ); + break; + } + case stmt_or_factor::Send: { + LangVarRef *varRef = walkVarRef( StmtOrFactor.var_ref() ); + ConsItemList *list = walkAccumulate( StmtOrFactor.accumulate() ); + bool eof = walkOptEos( StmtOrFactor.opt_eos() ); + expr = send( StmtOrFactor.SEND().loc(), varRef, list, eof ); + break; + } + case stmt_or_factor::SendTree: { + LangVarRef *varRef = walkVarRef( StmtOrFactor.var_ref() ); + ConsItemList *list = walkAccumulate( StmtOrFactor.accumulate() ); + bool eof = walkOptEos( StmtOrFactor.opt_eos() ); + expr = sendTree( StmtOrFactor.SEND_TREE().loc(), varRef, list, eof ); + break; + } + case stmt_or_factor::MakeTree: { + CallArgVect *exprList = walkCallArgList( StmtOrFactor.call_arg_list() ); + expr = LangExpr::cons( LangTerm::cons( StmtOrFactor.loc(), + LangTerm::MakeTreeType, exprList ) ); break; } - case code_factor::Cons: { + case stmt_or_factor::MakeToken: { + CallArgVect *exprList = walkCallArgList( StmtOrFactor.call_arg_list() ); + expr = LangExpr::cons( LangTerm::cons( StmtOrFactor.loc(), + LangTerm::MakeTokenType, exprList ) ); + break; + } + case stmt_or_factor::Cons: { /* The type we are parsing. */ - type_ref typeRefTree = codeFactor.type_ref(); + type_ref typeRefTree = StmtOrFactor.type_ref(); TypeRef *typeRef = walkTypeRef( typeRefTree ); - ObjectField *objField = walkOptCapture( codeFactor.opt_capture() ); - ConsItemList *list = walkConstructor( codeFactor.constructor(), typeRef ); - FieldInitVect *init = walkOptFieldInit( codeFactor.opt_field_init() ); + ObjectField *objField = walkOptCapture( StmtOrFactor.opt_capture() ); + ConsItemList *list = walkConstructor( StmtOrFactor.constructor(), typeRef ); + FieldInitVect *init = walkOptFieldInit( StmtOrFactor.opt_field_init() ); - expr = construct( codeFactor.CONS().loc(), objField, list, typeRef, init ); + expr = construct( StmtOrFactor.CONS().loc(), objField, list, typeRef, init ); break; } - case code_factor::Send: { - LangVarRef *varRef = walkVarRef( codeFactor.var_ref() ); - ConsItemList *list = walkAccumulate( codeFactor.accumulate() ); - bool eof = walkOptEos( codeFactor.opt_eos() ); - expr = send( codeFactor.SEND().loc(), varRef, list, eof ); + case stmt_or_factor::Match: { + LangVarRef *varRef = walkVarRef( StmtOrFactor.var_ref() ); + PatternItemList *list = walkPattern( StmtOrFactor.pattern(), varRef ); + expr = match( StmtOrFactor.loc(), varRef, list ); break; } - case code_factor::SendTree: { - LangVarRef *varRef = walkVarRef( codeFactor.var_ref() ); - ConsItemList *list = walkAccumulate( codeFactor.accumulate() ); - bool eof = walkOptEos( codeFactor.opt_eos() ); - expr = sendTree( codeFactor.SEND_TREE().loc(), varRef, list, eof ); + case stmt_or_factor::New: { + TypeRef *typeRef = walkTypeRef( StmtOrFactor.type_ref() ); + + ObjectField *captureField = walkOptCapture( StmtOrFactor.opt_capture() ); + FieldInitVect *init = walkFieldInit( StmtOrFactor.FieldInitList() ); + + LangVarRef *captureVarRef = 0; + if ( captureField != 0 ) { + captureVarRef = LangVarRef::cons( captureField->loc, + curNspace(), curStruct(), curScope(), captureField->name ); + } + + expr = LangExpr::cons( LangTerm::consNew( + StmtOrFactor.loc(), typeRef, captureVarRef, init ) ); + + /* Check for redeclaration. */ + if ( captureField != 0 ) { + if ( curScope()->checkRedecl( captureField->name ) != 0 ) { + error( captureField->loc ) << "variable " << + captureField->name << " redeclared" << endp; + } + + /* Insert it into the field map. */ + captureField->typeRef = typeRef; + curScope()->insertField( captureField->name, captureField ); + } + break; + }} + return expr; + } + + LangExpr *walkCodeFactor( code_factor codeFactor, bool used = true ) + { + LangExpr *expr = 0; + switch ( codeFactor.prodName() ) { + case code_factor::VarRef: { + LangVarRef *langVarRef = walkVarRef( codeFactor.var_ref() ); + LangTerm *term = LangTerm::cons( langVarRef->loc, + LangTerm::VarRefType, langVarRef ); + expr = LangExpr::cons( term ); + break; + } + case code_factor::Call: { + LangVarRef *langVarRef = walkVarRef( codeFactor.var_ref() ); + CallArgVect *exprVect = walkCallArgList( codeFactor.call_arg_list() ); + LangTerm *term = LangTerm::cons( langVarRef->loc, langVarRef, exprVect ); + expr = LangExpr::cons( term ); + break; + } + case code_factor::Number: { + String number = codeFactor.number().text().c_str(); + LangTerm *term = LangTerm::cons( codeFactor.number().loc(), + LangTerm::NumberType, number ); + expr = LangExpr::cons( term ); + break; + } + case code_factor::StmtOrFactor: { + expr = walkStmtOrFactor( codeFactor.stmt_or_factor() ); break; } case code_factor::Nil: { @@ -1904,12 +1983,6 @@ struct LoadColm expr = LangExpr::cons( LangTerm::cons( codeFactor.string().loc(), list ) ); break; } - case code_factor::Match: { - LangVarRef *varRef = walkVarRef( codeFactor.var_ref() ); - PatternItemList *list = walkPattern( codeFactor.pattern(), varRef ); - expr = match( codeFactor.loc(), varRef, list ); - break; - } case code_factor::In: { TypeRef *typeRef = walkTypeRef( codeFactor.type_ref() ); LangVarRef *varRef = walkVarRef( codeFactor.var_ref() ); @@ -1917,52 +1990,12 @@ struct LoadColm LangTerm::SearchType, typeRef, varRef ) ); break; } - case code_factor::MakeTree: { - CallArgVect *exprList = walkCallArgList( codeFactor.call_arg_list() ); - expr = LangExpr::cons( LangTerm::cons( codeFactor.loc(), - LangTerm::MakeTreeType, exprList ) ); - break; - } - case code_factor::MakeToken: { - CallArgVect *exprList = walkCallArgList( codeFactor.call_arg_list() ); - expr = LangExpr::cons( LangTerm::cons( codeFactor.loc(), - LangTerm::MakeTokenType, exprList ) ); - break; - } case code_factor::TypeId: { TypeRef *typeRef = walkTypeRef( codeFactor.type_ref() ); expr = LangExpr::cons( LangTerm::cons( codeFactor.loc(), LangTerm::TypeIdType, typeRef ) ); break; } - case code_factor::New: { - TypeRef *typeRef = walkTypeRef( codeFactor.type_ref() ); - - ObjectField *captureField = walkOptCapture( codeFactor.opt_capture() ); - FieldInitVect *init = walkFieldInit( codeFactor.FieldInitList() ); - - LangVarRef *captureVarRef = 0; - if ( captureField != 0 ) { - captureVarRef = LangVarRef::cons( captureField->loc, - curNspace(), curStruct(), curScope(), captureField->name ); - } - - expr = LangExpr::cons( LangTerm::consNew( - codeFactor.loc(), typeRef, captureVarRef, init ) ); - - /* Check for redeclaration. */ - if ( captureField != 0 ) { - if ( curScope()->checkRedecl( captureField->name ) != 0 ) { - error( captureField->loc ) << "variable " << - captureField->name << " redeclared" << endp; - } - - /* Insert it into the field map. */ - captureField->typeRef = typeRef; - curScope()->insertField( captureField->name, captureField ); - } - break; - } case code_factor::Cast: { TypeRef *typeRef = walkTypeRef( codeFactor.type_ref() ); LangExpr *castExpr = walkCodeFactor( codeFactor._code_factor() ); |