diff options
-rw-r--r-- | colm/colm.lm | 13 | ||||
-rw-r--r-- | colm/loadsrc.cc | 39 | ||||
-rw-r--r-- | colm/loadsrc.h | 2 | ||||
-rw-r--r-- | test/factor6.lm | 12 |
4 files changed, 54 insertions, 12 deletions
diff --git a/colm/colm.lm b/colm/colm.lm index 0b581e20..9668b041 100644 --- a/colm/colm.lm +++ b/colm/colm.lm @@ -13,6 +13,10 @@ lex token ELSE / 'else' / token IN / 'in' / + token NIL / 'nil' / + token TRUE / 'true' / + token FALSE / 'false' / + token id / ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) . ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' ) * @@ -161,11 +165,18 @@ def expr_stmt [CodeExpr: code_expr] def code_expr + [CodeFactor: code_factor] + +def code_factor [Number: number] | [Lit: lit] | [VarRef: var_ref POPEN CodeExprList: code_expr* PCLOSE] | [VarRef: var_ref] -| [PARSE opt_capture TypeRef: type_ref opt_field_init accumulate] +| [Parse: PARSE opt_capture TypeRef: type_ref opt_field_init accumulate] +| [Nil: NIL] +| [True: TRUE] +| [False: FALSE] +| [POPEN ParenCodeExpr: code_expr PCLOSE] def type_ref [RegionQual: region_qual Id: id OptRepeat: opt_repeat] diff --git a/colm/loadsrc.cc b/colm/loadsrc.cc index 97e46475..c9d5d5c7 100644 --- a/colm/loadsrc.cc +++ b/colm/loadsrc.cc @@ -350,36 +350,36 @@ LangVarRef *LoadSource::walkVarRef( var_ref varRef ) return langVarRef; } -LangExpr *LoadSource::walkCodeExpr( code_expr codeExpr ) +LangExpr *LoadSource::walkCodeFactor( code_factor codeFactor ) { LangExpr *expr = 0; - if ( codeExpr.VarRef() != 0 ) { - var_ref varRef = codeExpr.VarRef(); + if ( codeFactor.VarRef() != 0 ) { + var_ref varRef = codeFactor.VarRef(); LangVarRef *langVarRef = walkVarRef( varRef ); LangTerm *term; - if ( codeExpr.CodeExprList() == 0 ) { + if ( codeFactor.CodeExprList() == 0 ) { term = LangTerm::cons( internal, LangTerm::VarRefType, langVarRef ); } else { - ExprVect *exprVect = walkCodeExprList( codeExpr.CodeExprList() ); + ExprVect *exprVect = walkCodeExprList( codeFactor.CodeExprList() ); term = LangTerm::cons( internal, langVarRef, exprVect ); } expr = LangExpr::cons( term ); } - else if ( codeExpr.Number() != 0 ) { - String number = codeExpr.Number().text().c_str(); + else if ( codeFactor.Number() != 0 ) { + String number = codeFactor.Number().text().c_str(); LangTerm *term = LangTerm::cons( InputLoc(), LangTerm::NumberType, number ); expr = LangExpr::cons( term ); } - else if ( codeExpr.Lit() != 0 ) { - String lit = codeExpr.Lit().text().c_str(); + else if ( codeFactor.Lit() != 0 ) { + String lit = codeFactor.Lit().text().c_str(); LangTerm *term = LangTerm::cons( internal, LangTerm::StringType, lit ); expr = LangExpr::cons( term ); } - else { + else if ( codeFactor.Parse() != 0 ) { /* The type we are parsing. */ - type_ref typeRefTree = codeExpr.TypeRef(); + type_ref typeRefTree = codeFactor.TypeRef(); TypeRef *typeRef = walkTypeRef( typeRefTree ); LangVarRef *varRef = LangVarRef::cons( internal, new QualItemVect, String("stdin") ); @@ -392,9 +392,26 @@ LangExpr *LoadSource::walkCodeExpr( code_expr codeExpr ) expr = parseCmd( internal, false, objField, typeRef, 0, list ); } + else if ( codeFactor.Nil() != 0 ) { + expr = LangExpr::cons( LangTerm::cons( internal, LangTerm::NilType ) ); + } + else if ( codeFactor.True() != 0 ) { + expr = LangExpr::cons( LangTerm::cons( internal, LangTerm::TrueType ) ); + } + else if ( codeFactor.False() != 0 ) { + expr = LangExpr::cons( LangTerm::cons( internal, LangTerm::FalseType ) ); + } + else if ( codeFactor.ParenCodeExpr() != 0 ) { + expr = walkCodeExpr( codeFactor.ParenCodeExpr() ); + } return expr; } +LangExpr *LoadSource::walkCodeExpr( code_expr codeExpr ) +{ + return walkCodeFactor( codeExpr.CodeFactor() ); +} + LangStmt *LoadSource::walkExprStmt( expr_stmt &exprStmt ) { LangStmt *stmt; diff --git a/colm/loadsrc.h b/colm/loadsrc.h index 2d46fe2e..5f374890 100644 --- a/colm/loadsrc.h +++ b/colm/loadsrc.h @@ -55,6 +55,7 @@ struct lang_stmt_list; struct elsif_list; struct elsif_clause; struct optional_else; +struct code_factor; struct LoadSource : @@ -91,6 +92,7 @@ struct LoadSource LangStmt *walkElsifList( elsif_list elsifList ); LangStmt *walkStatement( statement Statement ); LangStmt *walkPrintStmt( print_stmt &PrintStmt ); + LangExpr *walkCodeFactor( code_factor codeFactor ); LangStmt *walkExprStmt( expr_stmt &ExprStmt ); QualItemVect *walkQual( qual &Qual ); LangVarRef *walkVarRef( var_ref varRef ); diff --git a/test/factor6.lm b/test/factor6.lm new file mode 100644 index 00000000..a9c0c199 --- /dev/null +++ b/test/factor6.lm @@ -0,0 +1,12 @@ +##### LM ##### +if ( 1 ) + print( 'a\n' ) +if ( nil ) + print( 'b\n' ) +if ( true ) + print( 'c\n' ) +if ( false ) + print( 'd\n' ) +##### EXP ##### +a +c |