summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2011-09-16 16:15:05 +0000
committerAdrian Thurston <thurston@complang.org>2011-09-16 16:15:05 +0000
commitc62b05cc7a68368826ef56d272ab4c5cf7f90ce2 (patch)
tree0bab28fc5a906a4c5dcec6215d57194b1c2cee66
parent426aa99b90ba9a523772d329c2fb51af65663ed6 (diff)
downloadcolm-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.vim2
-rw-r--r--colm/compile.cc22
-rw-r--r--colm/lmparse.kh2
-rw-r--r--colm/lmparse.kl9
-rw-r--r--colm/lmscan.rl1
-rw-r--r--colm/parsetree.h4
-rw-r--r--test/accum1.lm4
-rw-r--r--test/accum2.lm6
-rw-r--r--test/accum3.lm4
-rw-r--r--test/accumbt.lm16
-rw-r--r--test/argv2.lm4
-rw-r--r--test/btscan2.lm12
-rw-r--r--test/undofrag1.lm14
-rw-r--r--test/undofrag2.lm8
-rw-r--r--test/undofrag3.lm10
15 files changed, 70 insertions, 48 deletions
diff --git a/colm.vim b/colm.vim
index b52caeb6..43197c9f 100644
--- a/colm.vim
+++ b/colm.vim
@@ -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() )
}