From d8cf75e598caa001d03e14771cc900d40fa20b5e Mon Sep 17 00:00:00 2001 From: Adrian Thurston Date: Sun, 14 Apr 2013 11:59:22 -0400 Subject: can now put '.' or 'eos' on the end of a send to finish a parser --- colm/colm.lm | 12 +++++++++--- colm/loadcolm.cc | 9 +++++++-- colm/parser.cc | 6 +++--- colm/parser.h | 2 +- colm/parsetree.h | 12 ++++++++++++ colm/synthesis.cc | 16 ++++++++++++++++ 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; } -- cgit v1.2.1