summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2012-05-29 14:25:20 +0000
committerAdrian Thurston <thurston@complang.org>2012-05-29 14:25:20 +0000
commit21684cde6369ac7292d287ef1ab931df48308d6a (patch)
tree5851cf2315524fac5095847bb121c93324b3dcf0
parentdc24efc973f9c02b5fa778a99b6874b0eed43b45 (diff)
downloadcolm-21684cde6369ac7292d287ef1ab931df48308d6a.tar.gz
cleanup of region creation
-rw-r--r--colm/lmparse.kh1
-rw-r--r--colm/lmparse.kl95
2 files changed, 35 insertions, 61 deletions
diff --git a/colm/lmparse.kh b/colm/lmparse.kh
index 478b2471..86b70b6f 100644
--- a/colm/lmparse.kh
+++ b/colm/lmparse.kh
@@ -79,6 +79,7 @@ struct ColmParser
int token( InputLoc &loc, int tokId, char *tokstart, int toklen );
void addRegularDef( const InputLoc &loc, Namespace *nspace,
const String &name, Join *join );
+ TokenRegion *createRegion( String &name );
void addRegionDef( const InputLoc &loc, Namespace *nspace,
const String &name, TokenRegion *join );
void addProduction( const InputLoc &loc, const String &name,
diff --git a/colm/lmparse.kl b/colm/lmparse.kl
index d6dfdce0..3ead7c98 100644
--- a/colm/lmparse.kl
+++ b/colm/lmparse.kl
@@ -483,35 +483,20 @@ region_head:
final {
/* Just for ignores. */
String scannerNameIgn( $2->data.length() + 2, "<%s>-ign", $2->data.data );
- TokenRegion *tokenRegionIgn = new TokenRegion( InputLoc(), scannerNameIgn,
- pd->regionList.length(), regionStack.top() );
- regionStack.top()->childRegions.append( tokenRegionIgn );
- pd->regionList.append( tokenRegionIgn );
- addRegionDef( InputLoc(), namespaceStack.top(), scannerNameIgn, tokenRegionIgn );
+ TokenRegion *tokenRegionIgn = createRegion( scannerNameIgn );
/* Just for collect ignores. Will use the ignore-only start state. */
String scannerNameCi( $2->data.length() + 2, "<%s>-ci", $2->data.data );
- TokenRegion *tokenRegionCi = new TokenRegion( InputLoc(), scannerNameCi,
- pd->regionList.length(), regionStack.top() );
- regionStack.top()->childRegions.append( tokenRegionCi );
- pd->regionList.append( tokenRegionCi );
- addRegionDef( InputLoc(), namespaceStack.top(), scannerNameCi, tokenRegionCi );
+ TokenRegion *tokenRegionCi = createRegion( scannerNameCi );
/* Just for tokens. */
String scannerNameTok( $2->data.length() + 2, "<%s>-tok", $2->data.data );
- TokenRegion *tokenRegionTok = new TokenRegion( InputLoc(), scannerNameTok,
- pd->regionList.length(), regionStack.top() );
- regionStack.top()->childRegions.append( tokenRegionTok );
- pd->regionList.append( tokenRegionTok );
- addRegionDef( InputLoc(), namespaceStack.top(), scannerNameTok, tokenRegionTok );
+ TokenRegion *tokenRegionTok = createRegion( scannerNameTok );
/* Make the new token region. */
String scannerName( $2->data.length() + 2, "<%s>", $2->data.data );
- TokenRegion *tokenRegion = new TokenRegion( InputLoc(), scannerName,
- pd->regionList.length(), regionStack.top() );
- regionStack.top()->childRegions.append( tokenRegion );
- pd->regionList.append( tokenRegion );
- addRegionDef( InputLoc(), namespaceStack.top(), scannerName, tokenRegion );
+ TokenRegion *tokenRegion = createRegion( scannerName );
+
regionStack.push( tokenRegion );
tokenRegion->ignoreOnlyRegion = tokenRegionIgn;
@@ -949,35 +934,20 @@ literal_item: opt_no_ignore TK_Literal opt_no_ignore
if ( !insideRegion ) {
/* Just for ignores. */
String scannerNameIgn( name.length() + 2, "<%s>-ign", name.data );
- TokenRegion *tokenRegionIgn = new TokenRegion( InputLoc(), scannerNameIgn,
- pd->regionList.length(), regionStack.top() );
- regionStack.top()->childRegions.append( tokenRegionIgn );
- pd->regionList.append( tokenRegionIgn );
- addRegionDef( InputLoc(), namespaceStack.top(), scannerNameIgn, tokenRegionIgn );
+ TokenRegion *tokenRegionIgn = createRegion( scannerNameIgn );
/* Just for collect ignores. Will use the ignore-only start state. */
String scannerNameCi( name.length() + 2, "<%s>-ci", name.data );
- TokenRegion *tokenRegionCi = new TokenRegion( InputLoc(), scannerNameCi,
- pd->regionList.length(), regionStack.top() );
- regionStack.top()->childRegions.append( tokenRegionCi );
- pd->regionList.append( tokenRegionCi );
- addRegionDef( InputLoc(), namespaceStack.top(), scannerNameCi, tokenRegionCi );
+ TokenRegion *tokenRegionCi = createRegion( scannerNameCi );
/* Just for tokens. */
String scannerNameTok( name.length() + 2, "<%s>-tok", name.data );
- TokenRegion *tokenRegionTok = new TokenRegion( InputLoc(), scannerNameTok,
- pd->regionList.length(), regionStack.top() );
- regionStack.top()->childRegions.append( tokenRegionTok );
- pd->regionList.append( tokenRegionTok );
- addRegionDef( InputLoc(), namespaceStack.top(), scannerNameTok, tokenRegionTok );
+ TokenRegion *tokenRegionTok = createRegion( scannerNameTok );
/* Make a new token region just for the token. */
String scannerName( name.length() + 2, "<%s>", name.data );
- TokenRegion *tokenRegion = new TokenRegion( InputLoc(), scannerName,
- pd->regionList.length(), regionStack.top() );
- regionStack.top()->childRegions.append( tokenRegion );
- pd->regionList.append( tokenRegion );
- addRegionDef( InputLoc(), namespaceStack.top(), scannerName, tokenRegion );
+ TokenRegion *tokenRegion = createRegion( scannerName );
+
regionStack.push( tokenRegion );
tokenRegion->ignoreOnlyRegion = tokenRegionIgn;
@@ -1175,35 +1145,20 @@ token_def_name:
if ( !pd->insideRegion ) {
/* For just ignores. */
String scannerNameIgn( name.length() + 2, "<%s>-ign", name.data );
- TokenRegion *tokenRegionIgn = new TokenRegion( InputLoc(), scannerNameIgn,
- pd->regionList.length(), regionStack.top() );
- regionStack.top()->childRegions.append( tokenRegionIgn );
- pd->regionList.append( tokenRegionIgn );
- addRegionDef( InputLoc(), namespaceStack.top(), scannerNameIgn, tokenRegionIgn );
+ TokenRegion *tokenRegionIgn = createRegion( scannerNameIgn );
/* Just for explicitly collecting ignores. */
String scannerNameCi( name.length() + 2, "<%s>-ci", name.data );
- TokenRegion *tokenRegionCi = new TokenRegion( InputLoc(), scannerNameCi,
- pd->regionList.length(), regionStack.top() );
- regionStack.top()->childRegions.append( tokenRegionCi );
- pd->regionList.append( tokenRegionCi );
- addRegionDef( InputLoc(), namespaceStack.top(), scannerNameCi, tokenRegionCi );
-
+ TokenRegion *tokenRegionCi = createRegion( scannerNameCi );
+
/* Just for tokens. */
String scannerNameTok( name.length() + 2, "<%s>-tok", name.data );
- TokenRegion *tokenRegionTok = new TokenRegion( InputLoc(), scannerNameTok,
- pd->regionList.length(), regionStack.top() );
- regionStack.top()->childRegions.append( tokenRegionTok );
- pd->regionList.append( tokenRegionTok );
- addRegionDef( InputLoc(), namespaceStack.top(), scannerNameTok, tokenRegionTok );
+ TokenRegion *tokenRegionTok = createRegion( scannerNameTok );
/* If not inside a region, make one for the token. */
String scannerName( name.length() + 2, "<%s>", name.data );
- TokenRegion *tokenRegion = new TokenRegion( InputLoc(), scannerName,
- pd->regionList.length(), regionStack.top() );
- regionStack.top()->childRegions.append( tokenRegion );
- pd->regionList.append( tokenRegion );
- addRegionDef( InputLoc(), namespaceStack.top(), scannerName, tokenRegion );
+ TokenRegion *tokenRegion = createRegion( scannerName );
+
regionStack.push( tokenRegion );
tokenRegion->ignoreOnlyRegion = tokenRegionIgn;
@@ -2585,11 +2540,14 @@ void ColmParser::init()
/* Set up the root token region. */
const char *rootRegionName = "___ROOT_REGION";
+
TokenRegion *rootRegion = new TokenRegion( InputLoc(), rootRegionName,
pd->regionList.length(), 0 );
pd->regionList.append( rootRegion );
addRegionDef( InputLoc(), namespaceStack.top(), rootRegionName, rootRegion );
+
regionStack.push( rootRegion );
+
pd->rootRegion = rootRegion;
/* Set up the global object. */
@@ -2650,6 +2608,21 @@ void ColmParser::addRegularDef( const InputLoc &loc, Namespace *nspace,
}
}
+TokenRegion *ColmParser::createRegion( String &scannerName )
+{
+ TokenRegion *tokenRegion = new TokenRegion( InputLoc(), scannerName,
+ pd->regionList.length(), regionStack.top() );
+
+ regionStack.top()->childRegions.append( tokenRegion );
+
+ pd->regionList.append( tokenRegion );
+
+ addRegionDef( InputLoc(), namespaceStack.top(), scannerName, tokenRegion );
+
+ return tokenRegion;
+}
+
+
void ColmParser::addRegionDef( const InputLoc &loc, Namespace *nspace,
const String &name, TokenRegion *tokenRegion )
{