ack/lang/m2/comp/expression.g

294 lines
4.7 KiB
Plaintext
Raw Normal View History

/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*
* Author: Ceriel J.H. Jacobs
*/
1986-03-27 17:37:41 +00:00
/* E X P R E S S I O N S */
/* $Header$ */
1986-03-20 14:52:03 +00:00
{
1986-05-01 19:06:53 +00:00
#include "debug.h"
1986-03-27 17:37:41 +00:00
#include <alloc.h>
#include <em_arith.h>
#include <em_label.h>
1986-04-09 18:14:49 +00:00
#include <assert.h>
1986-05-01 19:06:53 +00:00
1986-03-27 17:37:41 +00:00
#include "LLlex.h"
#include "idf.h"
#include "def.h"
1986-04-06 17:42:56 +00:00
#include "node.h"
1986-04-07 17:40:38 +00:00
#include "type.h"
1986-06-17 12:04:05 +00:00
#include "chk_expr.h"
1986-11-05 14:33:00 +00:00
#include "warning.h"
extern char options[];
1986-03-20 14:52:03 +00:00
}
/* inline, we need room for pdp/11
number(t_node **p;) :
1986-04-06 17:42:56 +00:00
[
1986-05-28 18:36:51 +00:00
%default
1986-06-17 12:04:05 +00:00
INTEGER
1986-03-20 14:52:03 +00:00
|
1986-06-17 12:04:05 +00:00
REAL
] { *p = dot2leaf(Value);
1986-06-17 12:04:05 +00:00
(*p)->nd_type = toktype;
1986-04-07 17:40:38 +00:00
}
1986-03-20 14:52:03 +00:00
;
*/
1986-03-20 14:52:03 +00:00
qualident(t_node **p;)
1986-03-27 17:37:41 +00:00
{
} :
IDENT { *p = dot2leaf(Name); }
1986-03-27 17:37:41 +00:00
[
selector(p)
1986-03-27 17:37:41 +00:00
]*
1986-03-20 14:52:03 +00:00
;
selector(register t_node **pnd;)
{ t_node *nd;
} :
'.' { nd = dot2leaf(Select); nd->nd_NEXT = *pnd; *pnd = nd; }
1986-05-30 18:48:00 +00:00
IDENT { (*pnd)->nd_IDF = dot.TOK_IDF; }
1986-03-20 14:52:03 +00:00
;
ExpList(t_node **pnd;)
1986-04-06 17:42:56 +00:00
{
register t_node *nd;
1986-04-06 17:42:56 +00:00
} :
expression(pnd) { *pnd = nd = dot2node(Link,*pnd,NULLNODE);
1986-11-26 16:40:45 +00:00
nd->nd_symb = ',';
1986-04-10 01:08:49 +00:00
}
1986-04-06 17:42:56 +00:00
[
',' { nd->nd_RIGHT = dot2leaf(Link);
nd = nd->nd_RIGHT;
1986-04-06 17:42:56 +00:00
}
expression(&(nd->nd_LEFT))
1986-04-06 17:42:56 +00:00
]*
1986-03-20 14:52:03 +00:00
;
ConstExpression(register t_node **pnd;)
1986-11-26 16:40:45 +00:00
{
}:
1986-04-06 17:42:56 +00:00
expression(pnd)
1986-03-20 14:52:03 +00:00
/*
* Changed rule in new Modula-2.
* Check that the expression is a constant expression and evaluate!
*/
{
DO_DEBUG(options['C'], print("CONSTANT EXPRESSION\n"));
DO_DEBUG(options['C'], PrNode(*pnd, 0));
1986-11-26 16:40:45 +00:00
if (ChkExpression(pnd) &&
(*pnd)->nd_class != Set &&
(*pnd)->nd_class != Value &&
! (options['l'] && (*pnd)->nd_class == Def && IsProc((*pnd)))) {
1986-11-05 14:33:00 +00:00
error("constant expression expected");
1986-04-10 01:08:49 +00:00
}
1986-11-26 16:40:45 +00:00
DO_DEBUG(options['C'], print("RESULTS IN\n"));
DO_DEBUG(options['C'], PrNode(*pnd, 0));
1986-04-07 17:40:38 +00:00
}
1986-03-20 14:52:03 +00:00
;
1988-07-05 19:06:40 +00:00
expression(register t_node **pnd;)
1986-04-06 17:42:56 +00:00
{
} :
1986-04-07 17:40:38 +00:00
SimpleExpression(pnd)
1986-04-06 17:42:56 +00:00
[
/* relation */
1986-05-28 18:36:51 +00:00
[ '=' | '#' | '<' | LESSEQUAL | '>' | GREATEREQUAL | IN ]
{ *pnd = dot2node(Oper, *pnd, NULLNODE); }
SimpleExpression(&((*pnd)->nd_RIGHT))
1988-02-10 14:06:34 +00:00
|
]
1986-03-20 14:52:03 +00:00
;
1986-04-06 17:42:56 +00:00
/* Inline in expression
1986-03-20 14:52:03 +00:00
relation:
1986-05-28 18:36:51 +00:00
'=' | '#' | '<' | LESSEQUAL | '>' | GREATEREQUAL | IN
1986-03-20 14:52:03 +00:00
;
1986-04-06 17:42:56 +00:00
*/
1986-03-20 14:52:03 +00:00
1988-07-05 19:06:40 +00:00
SimpleExpression(register t_node **pnd;)
1986-04-06 17:42:56 +00:00
{
register t_node *nd = 0;
1986-04-06 17:42:56 +00:00
} :
1986-04-07 17:40:38 +00:00
[
[ '+' | '-' ]
{ nd = dot2leaf(Uoper);
1986-11-26 16:40:45 +00:00
/* priority of unary operator ??? */
1986-04-07 17:40:38 +00:00
}
1988-02-10 14:06:34 +00:00
|
]
1986-04-07 17:40:38 +00:00
term(pnd)
{ if (nd) {
nd->nd_RIGHT = *pnd;
*pnd = nd;
}
nd = *pnd;
}
1986-04-06 17:42:56 +00:00
[
/* AddOperator */
[ '+' | '-' | OR ]
{ nd = dot2node(Oper, nd, NULLNODE); }
term(&(nd->nd_RIGHT))
1986-04-06 17:42:56 +00:00
]*
{ *pnd = nd; }
1986-03-20 14:52:03 +00:00
;
1986-04-06 17:42:56 +00:00
/* Inline in "SimpleExpression"
1986-03-20 14:52:03 +00:00
AddOperator:
'+' | '-' | OR
;
1986-04-06 17:42:56 +00:00
*/
1986-03-20 14:52:03 +00:00
term(t_node **pnd;)
1986-04-06 17:42:56 +00:00
{
register t_node *nd;
1986-04-06 17:42:56 +00:00
}:
factor(pnd) { nd = *pnd; }
1986-04-06 17:42:56 +00:00
[
/* MulOperator */
[ '*' | '/' | DIV | MOD | AND ]
{ nd = dot2node(Oper, nd, NULLNODE); }
factor(&(nd->nd_RIGHT))
1986-04-06 17:42:56 +00:00
]*
{ *pnd = nd; }
1986-03-20 14:52:03 +00:00
;
1986-04-06 17:42:56 +00:00
/* inline in "term"
1986-03-20 14:52:03 +00:00
MulOperator:
'*' | '/' | DIV | MOD | AND
1986-03-20 14:52:03 +00:00
;
1986-04-06 17:42:56 +00:00
*/
1986-03-20 14:52:03 +00:00
factor(register t_node **p;)
1986-03-27 17:37:41 +00:00
{
1988-07-05 19:06:40 +00:00
register t_node *nd;
t_node *nd1;
1986-03-27 17:37:41 +00:00
} :
qualident(p)
1986-03-20 14:52:03 +00:00
[
1988-02-10 14:06:34 +00:00
designator_tail(p)
1986-04-06 17:42:56 +00:00
[
{ *p = dot2node(Call, *p, NULLNODE); }
ActualParameters(&((*p)->nd_RIGHT))
1988-02-10 14:06:34 +00:00
|
]
1986-04-07 17:40:38 +00:00
|
1988-07-05 19:06:40 +00:00
bare_set(&nd1)
{ nd = nd1; nd->nd_LEFT = *p; *p = nd; }
1986-03-20 14:52:03 +00:00
]
|
1986-04-06 17:42:56 +00:00
bare_set(p)
1986-03-20 14:52:03 +00:00
| %default
[
%default
INTEGER
|
REAL
|
STRING
] { *p = dot2leaf(Value);
(*p)->nd_type = toktype;
}
1986-03-20 14:52:03 +00:00
|
'(' { nd = dot2leaf(Uoper); }
expression(p)
{ /* In some cases we must leave the '(' as an unary
operator, because otherwise we cannot see that the
factor was not a designator
*/
register int class = (*p)->nd_class;
if (class == Arrsel ||
class == Arrow ||
class == Name ||
class == Select) {
nd->nd_RIGHT = *p;
*p = nd;
}
else FreeNode(nd);
1986-04-28 18:06:58 +00:00
}
')'
1986-03-20 14:52:03 +00:00
|
NOT { *p = dot2leaf(Uoper); }
factor(&((*p)->nd_RIGHT))
1986-03-20 14:52:03 +00:00
;
bare_set(t_node **pnd;)
1986-04-06 17:42:56 +00:00
{
register t_node *nd;
1986-04-06 17:42:56 +00:00
} :
'{' { DOT = SET;
*pnd = nd = dot2leaf(Xset);
1986-04-07 17:40:38 +00:00
nd->nd_type = bitset_type;
1986-04-06 17:42:56 +00:00
}
[
element(nd)
[ { nd = nd->nd_RIGHT; }
1986-04-07 17:40:38 +00:00
',' element(nd)
1986-04-06 17:42:56 +00:00
]*
1988-02-10 14:06:34 +00:00
|
]
1986-04-06 17:42:56 +00:00
'}'
1986-03-20 14:52:03 +00:00
;
ActualParameters(t_node **pnd;):
1986-04-06 17:42:56 +00:00
'(' ExpList(pnd)? ')'
1986-03-20 14:52:03 +00:00
;
1988-07-05 19:06:40 +00:00
element(register t_node *nd;) :
expression(&(nd->nd_RIGHT))
1986-04-06 17:42:56 +00:00
[
1986-04-07 17:40:38 +00:00
UPTO
{ nd->nd_RIGHT = dot2node(Link, nd->nd_RIGHT, NULLNODE);}
expression(&(nd->nd_RIGHT->nd_RIGHT))
1988-02-10 14:06:34 +00:00
|
]
{ nd->nd_RIGHT = dot2node(Link, nd->nd_RIGHT, NULLNODE);
nd->nd_RIGHT->nd_symb = ',';
1986-04-07 17:40:38 +00:00
}
1986-03-20 14:52:03 +00:00
;
designator(t_node **pnd;)
1986-10-06 20:36:30 +00:00
:
qualident(pnd)
1988-02-10 14:06:34 +00:00
designator_tail(pnd)
1986-03-20 14:52:03 +00:00
;
1988-07-05 19:06:40 +00:00
designator_tail(register t_node **pnd;):
1986-04-06 17:42:56 +00:00
visible_designator_tail(pnd)
1986-11-05 14:33:00 +00:00
[ %persistent
%default
1986-04-09 18:14:49 +00:00
selector(pnd)
1986-03-27 17:37:41 +00:00
|
1986-04-06 17:42:56 +00:00
visible_designator_tail(pnd)
1986-03-27 17:37:41 +00:00
]*
1988-02-10 14:06:34 +00:00
|
1986-03-20 14:52:03 +00:00
;
visible_designator_tail(t_node **pnd;)
{
register t_node *nd = *pnd;
}:
'[' { nd = dot2node(Arrsel, nd, NULLNODE); }
expression(&(nd->nd_RIGHT))
1986-04-09 18:14:49 +00:00
[
','
{ nd = dot2node(Arrsel, nd, NULLNODE);
1986-04-09 18:14:49 +00:00
}
expression(&(nd->nd_RIGHT))
1986-04-09 18:14:49 +00:00
]*
1986-04-06 17:42:56 +00:00
']'
{ *pnd = nd; }
1988-07-05 19:06:40 +00:00
|
'^' { *pnd = dot2node(Arrow, NULLNODE, nd); }
1986-03-20 14:52:03 +00:00
;