diff options
author | Adrian Thurston <thurston@complang.org> | 2011-09-16 16:15:05 +0000 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2011-09-16 16:15:05 +0000 |
commit | c62b05cc7a68368826ef56d272ab4c5cf7f90ce2 (patch) | |
tree | 0bab28fc5a906a4c5dcec6215d57194b1c2cee66 | |
parent | 426aa99b90ba9a523772d329c2fb51af65663ed6 (diff) | |
download | colm-c62b05cc7a68368826ef56d272ab4c5cf7f90ce2.tar.gz |
Added a syntax send Parser [Stuff], where send is now a keyword. Function
lookup now try applying a default function to the local objects. refs #322.
-rw-r--r-- | colm.vim | 2 | ||||
-rw-r--r-- | colm/compile.cc | 22 | ||||
-rw-r--r-- | colm/lmparse.kh | 2 | ||||
-rw-r--r-- | colm/lmparse.kl | 9 | ||||
-rw-r--r-- | colm/lmscan.rl | 1 | ||||
-rw-r--r-- | colm/parsetree.h | 4 | ||||
-rw-r--r-- | test/accum1.lm | 4 | ||||
-rw-r--r-- | test/accum2.lm | 6 | ||||
-rw-r--r-- | test/accum3.lm | 4 | ||||
-rw-r--r-- | test/accumbt.lm | 16 | ||||
-rw-r--r-- | test/argv2.lm | 4 | ||||
-rw-r--r-- | test/btscan2.lm | 12 | ||||
-rw-r--r-- | test/undofrag1.lm | 14 | ||||
-rw-r--r-- | test/undofrag2.lm | 8 | ||||
-rw-r--r-- | test/undofrag3.lm | 10 |
15 files changed, 70 insertions, 48 deletions
@@ -55,7 +55,7 @@ syntax match tlNumber "false" syntax keyword Type \ commit include literal iter \ namespace lex reducefirst global include - \ construct cons parse parse_stop match require + \ construct cons parse parse_stop match require send \ preeof left right nonassoc prec accum context parser alias syntax keyword typeKeywords diff --git a/colm/compile.cc b/colm/compile.cc index 8b4178fc..d224acd7 100644 --- a/colm/compile.cc +++ b/colm/compile.cc @@ -733,7 +733,8 @@ VarRefLookup LangVarRef::lookupField( ParseData *pd ) const return lookup; } -VarRefLookup LangVarRef::lookupMethod( ParseData *pd ) const + +VarRefLookup LangVarRef::lookupMethod( ParseData *pd ) { /* Lookup the object that the field is in. */ VarRefLookup lookup = lookupObj( pd ); @@ -741,8 +742,21 @@ VarRefLookup LangVarRef::lookupMethod( ParseData *pd ) const /* Find the method. */ assert( lookup.inObject->objMethodMap != 0 ); ObjMethod *method = lookup.inObject->findMethod( name ); - if ( method == 0 ) - error(loc) << "cannot find " << name << "(...) in object" << endp; + if ( method == 0 ) { + /* Not found as a method, try it as an object on which we will call a + * default function. */ + qual->append( QualItem( InputLoc(), name, QualItem::Dot ) ); + name = "finish"; + + /* Lookup the object that the field is in. */ + VarRefLookup lookup = lookupObj( pd ); + + /* Find the method. */ + assert( lookup.inObject->objMethodMap != 0 ); + method = lookup.inObject->findMethod( name ); + if ( method == 0 ) + error(loc) << "cannot find " << name << "(...) in object" << endp; + } lookup.objMethod = method; lookup.uniqueType = method->returnUT; @@ -1062,7 +1076,7 @@ void LangVarRef::popRefQuals( ParseData *pd, CodeVect &code, } } -UniqueType *LangVarRef::evaluateCall( ParseData *pd, CodeVect &code, ExprVect *args ) const +UniqueType *LangVarRef::evaluateCall( ParseData *pd, CodeVect &code, ExprVect *args ) { /* Evaluate the object. */ VarRefLookup lookup = lookupMethod( pd ); diff --git a/colm/lmparse.kh b/colm/lmparse.kh index 4014faaf..0dbd4717 100644 --- a/colm/lmparse.kh +++ b/colm/lmparse.kh @@ -58,7 +58,7 @@ struct Parser # Patterns. token KW_Match, KW_Construct, KW_Parse, KW_ParseStop, KW_New, KW_MakeToken, - KW_MakeTree, KW_TypeId, KW_Alias; + KW_MakeTree, KW_TypeId, KW_Alias, KW_Send; token KW_Include, KW_Preeof; diff --git a/colm/lmparse.kl b/colm/lmparse.kl index cacfea02..6fd52606 100644 --- a/colm/lmparse.kl +++ b/colm/lmparse.kl @@ -1276,6 +1276,15 @@ statement: var_ref TK_LtLt accumulate $$->stmt = new LangStmt( LangStmt::AccumType, $1->varRef, accumText ); }; +statement: KW_Send var_ref accumulate + final { + Namespace *nspace = namespaceStack.top(); + TokenRegion *region = regionStack.top(); + AccumText *accumText = new AccumText( $1->loc, nspace, region, replItemList ); + pd->accumTextList.append( accumText ); + + $$->stmt = new LangStmt( LangStmt::AccumType, $2->varRef, accumText ); + }; nonterm opt_require_stmt uses statement; diff --git a/colm/lmscan.rl b/colm/lmscan.rl index 7234ed0c..ef6ac44d 100644 --- a/colm/lmscan.rl +++ b/colm/lmscan.rl @@ -474,6 +474,7 @@ void Scanner::endSection( ) 'include' => {token( KW_Include ); }; 'context' => {token( KW_Context ); }; 'alias' => {token( KW_Alias ); }; + 'send' => {token( KW_Send ); }; # Identifiers. ident => { token( TK_Word, ts, te ); } ; diff --git a/colm/parsetree.h b/colm/parsetree.h index afc62e68..9a1f716f 100644 --- a/colm/parsetree.h +++ b/colm/parsetree.h @@ -1831,7 +1831,7 @@ struct LangVarRef void setFieldInstr( ParseData *pd, CodeVect &code, ObjectDef *inObject, ObjField *el, UniqueType *exprUT, bool revert ) const; - VarRefLookup lookupMethod( ParseData *pd ) const; + VarRefLookup lookupMethod( ParseData *pd ) ; VarRefLookup lookupField( ParseData *pd ) const; VarRefLookup lookupQualification( ParseData *pd, ObjectDef *rootDef ) const; @@ -1863,7 +1863,7 @@ struct LangVarRef ObjField **evaluateArgs( ParseData *pd, CodeVect &code, VarRefLookup &lookup, ExprVect *args ) const; void callOperation( ParseData *pd, CodeVect &code, VarRefLookup &lookup ) const; - UniqueType *evaluateCall( ParseData *pd, CodeVect &code, ExprVect *args ) const; + UniqueType *evaluateCall( ParseData *pd, CodeVect &code, ExprVect *args ); UniqueType *evaluate( ParseData *pd, CodeVect &code, bool forWriting = false ) const; ObjField *evaluateRef( ParseData *pd, CodeVect &code, long pushCount ) const; ObjField *preEvaluateRef( ParseData *pd, CodeVect &code ) const; diff --git a/test/accum1.lm b/test/accum1.lm index 5203a1d6..4125e72e 100644 --- a/test/accum1.lm +++ b/test/accum1.lm @@ -17,10 +17,10 @@ Input: start = parse start( stdin ) cons Output: accum<start> [] for Id: id in Input { - Output << + send Output "( [Id] ) } -S: start = Output.finish() +S: start = Output() print( S '\n' ) diff --git a/test/accum2.lm b/test/accum2.lm index 30dca44f..e1eac4d3 100644 --- a/test/accum2.lm +++ b/test/accum2.lm @@ -28,8 +28,6 @@ context ctx cons SP: parser<ctx::start> [] SP.ctx = cons ctx [] -SP << stdin -Input: ctx::start = SP.finish() +send SP stdin +Input: ctx::start = SP() print( Input '\n' ) - - diff --git a/test/accum3.lm b/test/accum3.lm index 3c1b194b..84fa1500 100644 --- a/test/accum3.lm +++ b/test/accum3.lm @@ -25,9 +25,9 @@ cons ArgParser: parser<args> [] ArgV: list<str> ArgV = argv for A: str in ArgV - ArgParser << [A '\0'] + send ArgParser [A '\0'] -Args: args = ArgParser.finish() +Args: args = ArgParser() print_xml( Args ) diff --git a/test/accumbt.lm b/test/accumbt.lm index fa7317a4..4576e1de 100644 --- a/test/accumbt.lm +++ b/test/accumbt.lm @@ -27,14 +27,14 @@ def start cons I: parser<start> [] -I << " id " -I << " 77 " -I << " 88 " -I << " \"hello\" " -I << " dude " -I << " dude\n" - -S: start = I.finish() +send I " id " +send I " 77 " +send I " 88 " +send I " \"hello\" " +send I " dude " +send I " dude\n" + +S: start = I() S = match S ~id 77 88 "hello" dude dude print_xml( S ) diff --git a/test/argv2.lm b/test/argv2.lm index 4c652c0e..7214b778 100644 --- a/test/argv2.lm +++ b/test/argv2.lm @@ -43,8 +43,8 @@ cons ArgParser: parser<args>[] # Parse the args and extract the result into Args. ArgV: list<str> = argv for A: str in ArgV - ArgParser << [A '\0'] -Args: args = ArgParser.finish() + send ArgParser [A '\0'] +Args: args = ArgParser() # Process the args. for Item: item in Args { diff --git a/test/btscan2.lm b/test/btscan2.lm index 8cc43a4a..b1d7c990 100644 --- a/test/btscan2.lm +++ b/test/btscan2.lm @@ -28,11 +28,11 @@ def item def btscan [item*] -Parser: parser<btscan> = cons parser<btscan> [] +cons Parser: parser<btscan> [] -Parser << "!ab" -Parser << "b " -Parser << "!ab" -Parser << "ba !aab\n" +send Parser "!ab" +send Parser "b " +send Parser "!ab" +send Parser "ba !aab\n" -print_xml(Parser.finish()) +print_xml( Parser() ) diff --git a/test/undofrag1.lm b/test/undofrag1.lm index 1316f336..2f2d4d04 100644 --- a/test/undofrag1.lm +++ b/test/undofrag1.lm @@ -12,7 +12,8 @@ def item2 def start2 [item2*] -global SP: parser<start2> = cons parser<start2> [] +global SP: parser<start2> = + cons parser<start2> [] context ctx { @@ -30,26 +31,25 @@ context ctx def A [] { print( 'A\n' ) - SP << "{ A{d} }" + send SP "{ A{d} }" } def B [] { print( 'B\n' ) - SP << "{ B{d} }" + send SP "{ B{d} }" } - def start [A item* '!'] | [B item* ';\n'] } -SP << "a b{c}" +send SP "a b{c}" CTX: ctx = cons ctx [] Input: ctx::start = parse ctx::start( CTX stdin ) -SP << "{e}f g" +send SP "{e}f g" print( Input ) -print( SP.finish() '\n' ) +print( SP() '\n' ) diff --git a/test/undofrag2.lm b/test/undofrag2.lm index 06430d7b..7f852490 100644 --- a/test/undofrag2.lm +++ b/test/undofrag2.lm @@ -17,13 +17,13 @@ def out def item [id] { - Out << r1 + send Out r1 } | ['(' item* ')'] { - Out << '(' - Out << r2 - Out << ')' + send Out '(' + send Out r2 + send Out ')' } def A1 [] diff --git a/test/undofrag3.lm b/test/undofrag3.lm index 6f9b703c..dc89d537 100644 --- a/test/undofrag3.lm +++ b/test/undofrag3.lm @@ -17,13 +17,13 @@ def out def item [id] { - Out << r1 + send Out r1 } | ['(' item* ')'] { - Out << '(' - Out << r2 - Out << ')' + send Out '(' + send Out r2 + send Out ')' } def A1 [] @@ -32,7 +32,7 @@ def A2 [] def F [] { - print_xml( Out.finish() ) + print_xml( Out() ) } |