diff options
-rw-r--r-- | src/colm.lm | 30 | ||||
-rw-r--r-- | src/loadcolm.cc | 285 | ||||
-rw-r--r-- | test/factor4.lm | 2 |
3 files changed, 177 insertions, 140 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() ); diff --git a/test/factor4.lm b/test/factor4.lm index 1eccd0b7..765559f6 100644 --- a/test/factor4.lm +++ b/test/factor4.lm @@ -1,2 +1,2 @@ -argv +L: list<str> = argv ##### EXP ##### |