newer version, partial parse trees
This commit is contained in:
@@ -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); }
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user