diff options
Diffstat (limited to 'frontend/parse.icl')
-rw-r--r-- | frontend/parse.icl | 80 |
1 files changed, 60 insertions, 20 deletions
diff --git a/frontend/parse.icl b/frontend/parse.icl index a7147da..0b02282 100644 --- a/frontend/parse.icl +++ b/frontend/parse.icl @@ -2964,6 +2964,9 @@ trySimpleTypeT_after_OpenToken ArrowToken attr pState = (ParseOk, {at_attribute = attr, at_type = TArrow}, pState) = (ParseFailWithError,{at_attribute = attr, at_type = TE}, parseError "arrow type" (Yes token) ")" pState) +trySimpleTypeT_after_OpenToken CloseToken attr pState + #! unit_type_ident = predefined_idents.[PD_UnitType] + = (ParseOk,{at_attribute=attr,at_type=TA (MakeNewTypeSymbIdent unit_type_ident 0) []},pState) trySimpleTypeT_after_OpenToken token attr pState # (annot_with_pos,atype, pState) = wantAnnotatedATypeWithPositionT token pState (token, pState) = nextToken TypeContext pState @@ -3387,19 +3390,37 @@ trySimplePatternT SquareOpenToken pState # (list_expr, pState) = wantListExp cIsAPattern pState = (True, list_expr, pState) trySimplePatternT OpenToken pState - # (args=:[exp:exps], pState) = want_pattern_list pState - pState = wantToken FunctionContext "pattern list" CloseToken pState - | isEmpty exps - = case exp of - PE_Ident id - -> (True, PE_List [exp], pState) - _ - -> (True, exp, pState) - = (True, PE_Tuple args, pState) + # (token, pState) = nextToken FunctionContext pState + = case token of + CloseToken + #! unit_cons_ident = predefined_idents.[PD_UnitConsSymbol] + -> (True,PE_Ident unit_cons_ident,pState) + _ + # (args=:[exp:exps], pState) = want_pattern_list_t token pState + pState = wantToken FunctionContext "pattern list" CloseToken pState + | isEmpty exps + -> case exp of + PE_Ident id + -> (True, PE_List [exp], pState) + _ + -> (True, exp, pState) + -> (True, PE_Tuple args, pState) where + want_pattern_list_t token pState + # (expr, pState) + = case token of + CharListToken charList // To produce a better error message + -> charListError charList pState + _ + -> wantPatternT token pState + = want_pattern_list_rest expr pState + want_pattern_list pState # (expr, pState) = wantPattern pState - (token, pState) = nextToken FunctionContext pState + = want_pattern_list_rest expr pState + + want_pattern_list_rest expr pState + # (token, pState) = nextToken FunctionContext pState | token == CommaToken # (exprs, pState) = want_pattern_list pState = ([expr : exprs], pState) @@ -3492,19 +3513,38 @@ trySimpleExpressionT SquareOpenToken pState # (list_expr, pState) = wantListExp cIsNotAPattern pState = (True, list_expr, pState) trySimpleExpressionT OpenToken pState - # (args=:[exp:exps], pState) = want_expression_list pState - pState = wantToken FunctionContext "expression list" CloseToken pState - | isEmpty exps - = case exp of - PE_Ident id - -> (True, PE_List [exp], pState) - _ - -> (True, exp, pState) - = (True, PE_Tuple args, pState) + # (token, pState) = nextToken FunctionContext pState + = case token of + CloseToken + #! unit_cons_ident = predefined_idents.[PD_UnitConsSymbol] + -> (True,PE_Ident unit_cons_ident,pState) + _ + # (args=:[exp:exps], pState) = want_expression_list_t token pState + pState = wantToken FunctionContext "expression list" CloseToken pState + | isEmpty exps + -> case exp of + PE_Ident id + -> (True, PE_List [exp], pState) + _ + -> (True, exp, pState) + -> (True, PE_Tuple args, pState) where + want_expression_list_t token pState + # (expr, pState) + = case token of + CharListToken charList + // To produce a better error message + -> charListError charList pState + _ + -> wantExpressionT token pState + = want_expression_list_rest expr pState + want_expression_list pState # (expr, pState) = wantExpression pState - (token, pState) = nextToken FunctionContext pState + = want_expression_list_rest expr pState + + want_expression_list_rest expr pState + # (token, pState) = nextToken FunctionContext pState | token == CommaToken # (exprs, pState) = want_expression_list pState = ([expr : exprs], pState) |