diff options
author | Adrian Thurston <thurston@complang.org> | 2012-09-09 10:53:50 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2012-09-09 10:53:50 -0400 |
commit | b0027de06edd375f88f66f31a1bf05fd0099ff09 (patch) | |
tree | f6f82a0818a8e24b7adfe26b167cb24416638405 | |
parent | 78ccb5b0f9fc62b0a893bc8c2adbdf779ad438ae (diff) | |
download | colm-b0027de06edd375f88f66f31a1bf05fd0099ff09.tar.gz |
bring back globals
-rw-r--r-- | colm.vim | 2 | ||||
-rw-r--r-- | colm/lmparse.kh | 2 | ||||
-rw-r--r-- | colm/lmparse.kl | 31 | ||||
-rw-r--r-- | colm/lmscan.rl | 1 |
4 files changed, 34 insertions, 2 deletions
@@ -54,7 +54,7 @@ syntax match tlNumber "false" syntax keyword Type \ commit include literal iter - \ namespace lex reducefirst include export + \ namespace lex reducefirst global include export \ construct cons parse parse_stop match require send \ preeof left right nonassoc prec accum context parser alias diff --git a/colm/lmparse.kh b/colm/lmparse.kh index 50baa500..97d8738e 100644 --- a/colm/lmparse.kh +++ b/colm/lmparse.kh @@ -53,7 +53,7 @@ struct ColmParser # Defining things. token KW_Rl, KW_Def, KW_Lex, KW_Context, KW_Ignore, KW_Token, KW_Commit, KW_Namespace, - KW_Literal, KW_ReduceFirst, KW_Map, KW_List, KW_Vector, KW_Parser, KW_Export, + KW_Literal, KW_ReduceFirst, KW_Map, KW_List, KW_Vector, KW_Parser, KW_Global, KW_Export, KW_Iter, KW_Reject, KW_Ptr, KW_Ref, KW_Deref; # Language. diff --git a/colm/lmparse.kl b/colm/lmparse.kl index c29a59a7..3c59eb7c 100644 --- a/colm/lmparse.kl +++ b/colm/lmparse.kl @@ -72,6 +72,7 @@ root_item: context_def commit final { $$->stmt = 0; }; root_item: namespace_def commit final { $$->stmt = 0; }; root_item: function_def commit final { $$->stmt = 0; }; root_item: iter_def commit final { $$->stmt = 0; }; +root_item: global_def commit final { $$->stmt = 0; }; root_item: export_def commit final { $$->stmt = 0; }; root_item: statement commit final { $$->stmt = $1->stmt; }; root_item: pre_eof commit final { $$->stmt = 0; }; @@ -185,6 +186,36 @@ reference_type_ref: KW_Ref type_ref $$->typeRef = TypeRef::cons( $1->loc, TypeRef::Ref, $2->typeRef ); }; +nonterm global_def uses statement; + +global_def: KW_Global var_def opt_def_init + final { + $$->stmt = 0; + + ObjectDef *object; + if ( contextStack.length() == 0 ) + object = pd->globalObjectDef; + else { + Context *context = contextStack.top(); + $2->objField->context = context; + object = context->contextObjDef; + } + + if ( object->checkRedecl( $2->objField->name ) != 0 ) + error($2->objField->loc) << "object field renamed" << endp; + + object->insertField( $2->objField->name, $2->objField ); + + if ( $3->expr != 0 ) { + LangVarRef *varRef = LangVarRef::cons( $2->objField->loc, + $2->objField->name ); + + $$->stmt = LangStmt::cons( $2->objField->loc, + $3->assignType, varRef, $3->expr ); + } + }; + + nonterm export_def uses statement; export_def: KW_Export var_def opt_def_init diff --git a/colm/lmscan.rl b/colm/lmscan.rl index b53f0657..d38df495 100644 --- a/colm/lmscan.rl +++ b/colm/lmscan.rl @@ -463,6 +463,7 @@ void ColmScanner::endSection( ) 'false' => { token( KW_False ); }; 'parse' => { token( KW_Parse ); }; 'parse_stop' => { token( KW_ParseStop ); }; + 'global' => { token( KW_Global ); }; 'export' => { token( KW_Export ); }; 'ptr' => { token( KW_Ptr ); }; 'ref' => { token( KW_Ref ); }; |