newer version, partial parse trees

This commit is contained in:
ceriel
1986-04-06 17:42:56 +00:00
parent 0e4311490c
commit 376c47c98f
13 changed files with 418 additions and 220 deletions

View File

@@ -10,15 +10,18 @@ static char *RcsId = "$Header$";
#include "idf.h"
#include "def.h"
#include "scope.h"
#include "node.h"
}
number:
number(struct node **p;):
[
INTEGER
|
REAL
] { *p = MkNode(Value, NULLNODE, NULLNODE, dot); }
;
qualident(int types; struct def **pdf; char *str;)
qualident(int types; struct def **pdf; char *str; struct node **p;)
{
int scope;
int module;
@@ -30,6 +33,9 @@ qualident(int types; struct def **pdf; char *str;)
*pdf = df;
if (df->df_kind == D_ERROR) types = 0;
}
if (p) {
*p = MkNode(Value, NULLNODE, NULLNODE,&dot);
}
}
[
{ if (types &&!(scope = has_selectors(df))) {
@@ -38,8 +44,13 @@ qualident(int types; struct def **pdf; char *str;)
}
}
/* selector */
'.' IDENT
{ if (types) {
'.' { if (p) *p = MkNode(Link, *p, NULLNODE, &dot); }
IDENT
{ if (p) {
p = &((*p)->nd_right);
*p = MkNode(Value, NULLNODE, NULLNODE,&dot);
}
if (types) {
module = (df->df_kind == D_MODULE);
df = lookup(dot.TOK_IDF, scope);
if (!df) {
@@ -62,99 +73,179 @@ qualident(int types; struct def **pdf; char *str;)
}
;
/* Inline substituted wherever it occurred
selector:
'.' /* field */ IDENT
'.' IDENT
;
*/
ExpList(struct node **pnd;)
{
struct node **nd;
} :
expression(pnd) { nd = pnd; }
[
',' { *nd = MkNode(Link, *nd, NULLNODE, &dot);
nd = &(*nd)->nd_right;
}
expression(nd)
]*
;
ExpList:
expression [ ',' expression ]*
;
ConstExpression:
expression
ConstExpression(struct node **pnd;):
expression(pnd)
/*
* Changed rule in new Modula-2.
* Check that the expression is a constant expression and evaluate!
*/
;
expression:
SimpleExpression [ relation SimpleExpression ]?
expression(struct node **pnd;)
{
struct node *nd;
} :
SimpleExpression(&nd)
[
/* relation */
[ '=' | '#' | UNEQUAL | '<' | LESSEQUAL | '>' |
GREATEREQUAL | IN
]
{ nd = MkNode(Oper, nd, NULLNODE, &dot); }
SimpleExpression(&(nd->nd_right))
]?
{ *pnd = nd; }
;
/* Inline in expression
relation:
'=' | '#' | UNEQUAL | '<' | LESSEQUAL | '>' | GREATEREQUAL | IN
;
*/
SimpleExpression:
[ '+' | '-' ]? term [ AddOperator term ]*
;
AddOperator:
'+' | '-' | OR
;
term:
factor [ MulOperator factor ]*
;
MulOperator:
'*' | '/' | DIV | MOD | AND | '&'
;
factor
SimpleExpression(struct node **pnd;)
{
struct def *df;
register struct node *nd;
} :
qualident(0, &df, (char *) 0)
[ '+' | '-' ]?
term(pnd) { nd = *pnd; }
[
designator_tail? ActualParameters?
|
bare_set
]
|
bare_set
| %default
number
|
STRING
|
'(' expression ')'
|
NOT factor
;
bare_set:
'{' [ element [ ',' element ]* ]? '}'
;
ActualParameters:
'(' ExpList? ')'
;
element:
expression [ UPTO expression ]?
;
designator
{
struct def *df;
} :
qualident(0, &df, (char *) 0)
designator_tail?
;
designator_tail:
visible_designator_tail
[
selector
|
visible_designator_tail
/* AddOperator */
[ '+' | '-' | OR ]
{ *pnd = nd = MkNode(Oper, nd, NULLNODE, &dot); }
term(&(nd->nd_right))
]*
;
visible_designator_tail:
'[' ExpList ']'
|
'^'
/* Inline in "SimpleExpression"
AddOperator:
'+' | '-' | OR
;
*/
term(struct node **pnd;)
{
register struct node *nd;
}:
factor(pnd) { nd = *pnd; }
[
/* MulOperator */
[ '*' | '/' | DIV | MOD | AND | '&' ]
{ *pnd = nd = MkNode(Oper, nd, NULLNODE, &dot); }
factor(&(nd->nd_right))
]*
;
/* inline in "term"
MulOperator:
'*' | '/' | DIV | MOD | AND | '&'
;
*/
factor(struct node **p;)
{
struct def *df;
} :
qualident(0, &df, (char *) 0, p)
[
designator_tail(p)?
[
{ *p = MkNode(Call, p, NULLNODE, &dot); }
ActualParameters(&((*p)->nd_right))
]?
| { *p = MkNode(Call, p, NULLNODE, &dot); }
bare_set(&((*p)->nd_right))
]
|
bare_set(p)
| %default
number(p)
|
STRING { *p = MkNode(Value, NULLNODE, NULLNODE, &dot); }
|
'(' expression(p) ')'
|
NOT { *p = MkNode(Uoper, NULLNODE, NULLNODE, &dot); }
factor(&((*p)->nd_left))
;
bare_set(struct node **pnd;)
{
struct node **nd;
} :
'{' {
dot.tk_symb = SET;
*pnd = MkNode(Link, NULLNODE, NULLNODE, &dot);
nd = &((*pnd)->nd_left);
}
[
element(nd)
[
',' { *nd = MkNode(Link, *nd, NULLNODE, &dot);
nd = &((*nd)->nd_right);
}
element(nd)
]*
]?
'}'
;
ActualParameters(struct node **pnd;):
'(' ExpList(pnd)? ')'
;
element(struct node **pnd;):
expression(pnd)
[
UPTO { *pnd = MkNode(Link, *pnd, NULLNODE, &dot);}
expression(&((*pnd)->nd_right))
]?
;
designator(struct node **pnd;)
{
struct def *df;
} :
qualident(0, &df, (char *) 0, pnd)
designator_tail(pnd)?
;
designator_tail(struct node **pnd;):
visible_designator_tail(pnd)
[
/* selector */
'.' { *pnd = MkNode(Oper, *pnd, NULLNODE, &dot); }
IDENT { (*pnd)->nd_right =
MkNode(Value, NULLNODE, NULLNODE, &dot);
}
|
visible_designator_tail(pnd)
]*
;
visible_designator_tail(struct node **pnd;):
'[' { *pnd = MkNode(Oper, *pnd, NULLNODE, &dot); }
ExpList(&((*pnd)->nd_right))
']'
|
'^' { *pnd = MkNode(Oper, *pnd, NULLNODE, &dot); }
;