summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2012-09-09 10:53:50 -0400
committerAdrian Thurston <thurston@complang.org>2012-09-09 10:53:50 -0400
commitb0027de06edd375f88f66f31a1bf05fd0099ff09 (patch)
treef6f82a0818a8e24b7adfe26b167cb24416638405
parent78ccb5b0f9fc62b0a893bc8c2adbdf779ad438ae (diff)
downloadragel-b0027de06edd375f88f66f31a1bf05fd0099ff09.tar.gz
bring back globals
-rw-r--r--colm.vim2
-rw-r--r--colm/lmparse.kh2
-rw-r--r--colm/lmparse.kl31
-rw-r--r--colm/lmscan.rl1
4 files changed, 34 insertions, 2 deletions
diff --git a/colm.vim b/colm.vim
index 15e9e649..d8eb44a6 100644
--- a/colm.vim
+++ b/colm.vim
@@ -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 ); };