summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2013-04-14 11:59:22 -0400
committerAdrian Thurston <thurston@complang.org>2013-04-14 11:59:22 -0400
commitd8cf75e598caa001d03e14771cc900d40fa20b5e (patch)
tree9256fa930e01d0c19f547ab4bd047f032bf1e180
parent9ded7ffab271affabe1a85cc31ddace7f3c13da4 (diff)
downloadcolm-d8cf75e598caa001d03e14771cc900d40fa20b5e.tar.gz
can now put '.' or 'eos' on the end of a send to finish a parser
-rw-r--r--colm/colm.lm12
-rw-r--r--colm/loadcolm.cc9
-rw-r--r--colm/parser.cc6
-rw-r--r--colm/parser.h2
-rw-r--r--colm/parsetree.h12
-rw-r--r--colm/synthesis.cc16
6 files changed, 48 insertions, 9 deletions
diff --git a/colm/colm.lm b/colm/colm.lm
index 8d197484..c7b5b3d3 100644
--- a/colm/colm.lm
+++ b/colm/colm.lm
@@ -41,6 +41,7 @@ lex
token NEW / 'new' /
token PREEOF / 'preeof' /
token GLOBAL / 'global' /
+ token EOS / 'eos' /
token MAKE_TOKEN / 'make_token' /
token MAKE_TREE / 'make_tree' /
@@ -445,6 +446,11 @@ def code_unary
| [Percent: PERCENT Factor: code_factor]
| [Factor: code_factor]
+def opt_eos
+ [Eos: DOT]
+| [Eos: EOS]
+| []
+
def code_factor
[Number: number]
| [Lit: lit]
@@ -454,7 +460,7 @@ def code_factor
| [True: TRUE]
| [False: FALSE]
| [POPEN ParenCodeExpr: code_expr PCLOSE]
-| [Send: SEND ToVarRef: var_ref Accumulate: accumulate]
+| [Send: SEND ToVarRef: var_ref Accumulate: accumulate OptEos: opt_eos]
| [ToVarRef: var_ref Send: LTLT Accumulate: accumulate]
| [Parse: PARSE OptCapture: opt_capture TypeRef: type_ref
OptFieldInit: opt_field_init Accumulate: accumulate]
@@ -640,12 +646,12 @@ def lex_expr
| [Expr: lex_expr DashDash: LEX_DASHDASH Term: lex_term]
| [Term: lex_term]
-def opt_dot
+def opt_lex_dot
[LEX_DOT]
| []
def lex_term
- [Term: lex_term OptDot: opt_dot FactorRep: lex_factor_rep]
+ [Term: lex_term OptDot: opt_lex_dot FactorRep: lex_factor_rep]
| [Term: lex_term ColonGt: LEX_COLON_GT FactorRep: lex_factor_rep]
| [Term: lex_term ColonGtGt: LEX_COLON_GTGT FactorRep: lex_factor_rep]
| [Term: lex_term LtColon: LEX_LT_COLON FactorRep: lex_factor_rep]
diff --git a/colm/loadcolm.cc b/colm/loadcolm.cc
index e0c4b3cf..995153db 100644
--- a/colm/loadcolm.cc
+++ b/colm/loadcolm.cc
@@ -314,7 +314,6 @@ struct LoadColm
}
}
-
void walkTokenDef( token_def TokenDef )
{
String name = TokenDef.Id().text().c_str();
@@ -1449,7 +1448,8 @@ struct LoadColm
else if ( codeFactor.Send() != 0 ) {
LangVarRef *varRef = walkVarRef( codeFactor.ToVarRef() );
ConsItemList *list = walkAccumulate( codeFactor.Accumulate() );
- expr = send( codeFactor.Send().loc(), varRef, list );
+ bool eof = walkOptEos( codeFactor.OptEos() );
+ expr = send( codeFactor.Send().loc(), varRef, list, eof );
}
else if ( codeFactor.Nil() != 0 ) {
expr = LangExpr::cons( LangTerm::cons( codeFactor.Nil().loc(),
@@ -1845,6 +1845,11 @@ struct LoadColm
return OptNoIngore.Ni() != 0;
}
+ bool walkOptEos( opt_eos OptEos )
+ {
+ return OptEos.Eos() != 0;
+ }
+
void walkLiteralItem( literal_item literalItem )
{
bool niLeft = walkOptNoIgnore( literalItem.NiLeft() );
diff --git a/colm/parser.cc b/colm/parser.cc
index 76dd00a6..3b60cb77 100644
--- a/colm/parser.cc
+++ b/colm/parser.cc
@@ -526,14 +526,14 @@ LexJoin *BaseParser::lexOptJoin( LexJoin *join, LexJoin *context )
return join;
}
-LangExpr *BaseParser::send( const InputLoc &loc, LangVarRef *varRef, ConsItemList *list )
+LangExpr *BaseParser::send( const InputLoc &loc, LangVarRef *varRef, ConsItemList *list, bool eof )
{
Namespace *nspace = namespaceStack.top();
ParserText *parserText = ParserText::cons( loc, nspace, list );
pd->parserTextList.append( parserText );
- return LangExpr::cons( LangTerm::cons( InputLoc(),
- LangTerm::SendType, varRef, parserText ) );
+ return LangExpr::cons( LangTerm::consSend( loc, varRef,
+ parserText, eof ) );
}
LangExpr *BaseParser::parseCmd( const InputLoc &loc, bool stop, ObjectField *objField,
diff --git a/colm/parser.h b/colm/parser.h
index ed028065..55af2c4f 100644
--- a/colm/parser.h
+++ b/colm/parser.h
@@ -85,7 +85,7 @@ struct BaseParser
LexFactorAug *lexFactorLabel( const InputLoc &loc, const String &data,
LexFactorAug *factorAug );
LexJoin *lexOptJoin( LexJoin *join, LexJoin *context );
- LangExpr *send( const InputLoc &loc, LangVarRef *varRef, ConsItemList *list );
+ LangExpr *send( const InputLoc &loc, LangVarRef *varRef, ConsItemList *list, bool eof );
LangExpr *parseCmd( const InputLoc &loc, bool stop, ObjectField *objField,
TypeRef *typeRef, FieldInitVect *fieldInitVect, ConsItemList *list );
PatternItemList *patternEl( LangVarRef *varRef, PatternItemList *list );
diff --git a/colm/parsetree.h b/colm/parsetree.h
index 6c885282..24bcdc74 100644
--- a/colm/parsetree.h
+++ b/colm/parsetree.h
@@ -2596,6 +2596,17 @@ struct LangTerm
return s;
}
+ static LangTerm *consSend( const InputLoc &loc, LangVarRef *varRef, ParserText *parserText, bool eof )
+ {
+ LangTerm *s = new LangTerm;
+ s->loc = loc;
+ s->type = SendType;
+ s->varRef = varRef;
+ s->parserText = parserText;
+ s->eof = eof;
+ return s;
+ }
+
void resolve( Compiler *pd );
UniqueType *evaluateNew( Compiler *pd, CodeVect &code ) const;
@@ -2625,6 +2636,7 @@ struct LangTerm
ParserText *parserText;
LangExpr *expr;
ConsItemList *consItemList;
+ bool eof;
};
struct LangExpr
diff --git a/colm/synthesis.cc b/colm/synthesis.cc
index ffa89993..2ca12f48 100644
--- a/colm/synthesis.cc
+++ b/colm/synthesis.cc
@@ -1586,6 +1586,22 @@ UniqueType *LangTerm::evaluateSend( Compiler *pd, CodeVect &code ) const
parseFrag( pd, code, 0 );
}
+ if ( eof ) {
+ code.append( IN_PARSE_SAVE_STEPS );
+ if ( pd->revertOn ) {
+ code.append( IN_PARSE_FINISH_WV );
+ code.appendHalf( 0 );
+ code.append( IN_PCR_CALL );
+ code.append( IN_PARSE_FINISH_EXIT_WV );
+ }
+ else {
+ code.append( IN_PARSE_FINISH_WC );
+ code.appendHalf( 0 );
+ code.append( IN_PCR_CALL );
+ code.append( IN_PARSE_FINISH_EXIT_WC );
+ }
+ }
+
return varUt;
}