summaryrefslogtreecommitdiff
path: root/colm
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2013-03-19 21:37:36 -0400
committerAdrian Thurston <thurston@complang.org>2013-03-19 21:37:36 -0400
commitdc6288f07a8b3db80ab7f0ec2945de041eb34b51 (patch)
treefb82553942949510bed1be7fdebe56c5988c2350 /colm
parent0a1733ce7d3c8a7f4168c22b09898c9e86de4b3f (diff)
downloadcolm-dc6288f07a8b3db80ab7f0ec2945de041eb34b51.tar.gz
added nil, true, false and parenthesis expressions
Diffstat (limited to 'colm')
-rw-r--r--colm/colm.lm13
-rw-r--r--colm/loadsrc.cc39
-rw-r--r--colm/loadsrc.h2
3 files changed, 42 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 );