Skip to content

Commit

Permalink
- Added parsing support for empty tuples, and Modelica wildcard matching
Browse files Browse the repository at this point in the history
in tuples: (a,,c) is (a,Absyn__WILD,c). It's the same as writing (a,_,c) with
a MetaModelica lexer.


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@6054 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Sep 8, 2010
1 parent 81c1c3a commit 83fcbb7
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 13 deletions.
2 changes: 1 addition & 1 deletion Parser/Makefile.common
Expand Up @@ -92,4 +92,4 @@ clean:
rm -f *.o *.a \
ModelicaParser.c ModelicaParser.h \
*Modelica*_Lexer.c *Modelica*_Lexer.h \
*.tokens
*.tokens *.stamp *.stamp.tmp
47 changes: 35 additions & 12 deletions Parser/Modelica.g
Expand Up @@ -891,7 +891,9 @@ factor returns [void* ast] :
}
;
primary returns [void* ast] :
primary returns [void* ast] @declarations {
bool tupleExpressionIsTuple = 0;
} :
( v=UNSIGNED_INTEGER
{
char* chars = $v.text->chars;
Expand Down Expand Up @@ -930,7 +932,10 @@ primary returns [void* ast] :
| T_TRUE {$ast = Absyn__BOOL(RML_TRUE);}
| ptr=component_reference__function_call {$ast = ptr;}
| DER el=function_call {$ast = Absyn__CALL(Absyn__CREF_5fIDENT(mk_scon("der"), mk_nil()),el);}
| LPAR e=expression (COMMA el=expression_list)? RPAR {$ast = el ? Absyn__TUPLE(mk_cons(e, el)) : e;}
| LPAR el=output_expression_list[&tupleExpressionIsTuple]
{
$ast = tupleExpressionIsTuple ? Absyn__TUPLE(el) : el;
}
| LBRACK el=matrix_expression_list RBRACK {$ast = Absyn__MATRIX(el);}
| LBRACE for_or_el=for_or_expression_list RBRACE
{
Expand Down Expand Up @@ -1036,6 +1041,29 @@ named_argument returns [void* ast] :
( id=IDENT | id=OPERATOR) EQUALS e=expression {ast = Absyn__NAMEDARG(token_to_scon(id),e);}
;

output_expression_list [bool* isTuple] returns [void* ast] :
( RPAR
{
ast = mk_nil();
*isTuple = true;
}
| COMMA {*isTuple = true;} el=output_expression_list[isTuple]
{
$ast = mk_cons(Absyn__CREF(Absyn__WILD), el);
}
| e1=expression
( COMMA {*isTuple = true;} el=output_expression_list[isTuple]
{
ast = mk_cons(e1, el);
}
| RPAR
{
ast = *isTuple ? mk_cons(e1, mk_nil()) : e1;
}
)
)
;

expression_list returns [void* ast] :
e1=expression (COMMA el=expression_list)? { ast = (el==NULL ? mk_cons(e1,mk_nil()) : mk_cons(e1,el)); }
;
Expand Down Expand Up @@ -1182,11 +1210,11 @@ interactive_stmt_list [bool *last_sc] returns [void* ast] @init {

/* MetaModelica */
match_expression returns [void* ast] :
( (ty=MATCHCONTINUE exp=expression_or_empty cmt=string_comment
( (ty=MATCHCONTINUE exp=expression cmt=string_comment
es=local_clause
cs=cases
T_END MATCHCONTINUE)
| (ty=MATCH exp=expression_or_empty cmt=string_comment
| (ty=MATCH exp=expression cmt=string_comment
es=local_clause
cs=cases
T_END MATCH)
Expand All @@ -1211,7 +1239,7 @@ cases returns [void* ast] :
;

cases2 returns [void* ast] :
( (ELSE (cmt=string_comment es=local_clause (EQUATION eqs=equation_list_then)? THEN)? exp=expression_or_empty SEMICOLON)?
( (ELSE (cmt=string_comment es=local_clause (EQUATION eqs=equation_list_then)? THEN)? exp=expression SEMICOLON)?
{
if (exp)
ast = mk_cons(Absyn__ELSE(es,or_nil(eqs),exp,mk_some_or_none(cmt)),mk_nil());
Expand All @@ -1226,17 +1254,12 @@ cases2 returns [void* ast] :
;

onecase returns [void* ast] :
(CASE pat=pattern cmt=string_comment es=local_clause (EQUATION eqs=equation_list_then)? THEN exp=expression_or_empty SEMICOLON)
(CASE pat=pattern cmt=string_comment es=local_clause (EQUATION eqs=equation_list_then)? THEN exp=expression SEMICOLON)
{
ast = Absyn__CASE(pat,es,or_nil(eqs),exp,mk_some_or_none(cmt));
}
;

pattern returns [void* ast] :
e=expression_or_empty {ast = e;}
;

expression_or_empty returns [void* ast] :
e = expression {ast = e;}
| LPAR RPAR {ast = Absyn__TUPLE(mk_nil());}
e=expression {ast = e;}
;

0 comments on commit 83fcbb7

Please sign in to comment.