aboutsummaryrefslogtreecommitdiff
path: root/gcc/m2/gm2-compiler/PHBuild.bnf
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/m2/gm2-compiler/PHBuild.bnf')
-rw-r--r--gcc/m2/gm2-compiler/PHBuild.bnf86
1 files changed, 66 insertions, 20 deletions
diff --git a/gcc/m2/gm2-compiler/PHBuild.bnf b/gcc/m2/gm2-compiler/PHBuild.bnf
index 7bd5bcc..8153870 100644
--- a/gcc/m2/gm2-compiler/PHBuild.bnf
+++ b/gcc/m2/gm2-compiler/PHBuild.bnf
@@ -130,12 +130,12 @@ FROM SymbolTable IMPORT MakeGnuAsm, PutGnuAsmVolatile, PutGnuAsm, PutGnuAsmInput
PutGnuAsmOutput, PutGnuAsmTrash, PutGnuAsmVolatile,
MakeRegInterface,
PutRegInterface, GetRegInterface,
- GetSymName, GetType,
+ GetSymName, GetType, GetCurrentModule,
NulSym,
StartScope, EndScope,
PutIncluded,
IsVarParam, IsProcedure, IsDefImp, IsModule,
- IsRecord, IsProcType,
+ IsRecord, IsProcType, IsInnerModule, IsImported,
RequestSym,
GetSym, GetLocalSym ;
@@ -368,6 +368,68 @@ BEGIN
Expect(realtok, stopset0, stopset1, stopset2)
END Real ;
+
+(*
+ PushTFQualident - push the result of the Qualident
+ to the stack. It checks to see if init
+ is a procedure or proc type and if so
+ it does not push the return type.
+*)
+
+PROCEDURE PushTFQualident (tok, tokstart: CARDINAL;
+ init: CARDINAL) ;
+BEGIN
+ IF tok#tokstart
+ THEN
+ tok := MakeVirtualTok (tokstart, tokstart, tok)
+ END ;
+ IF IsProcedure (init) OR IsProcType (init)
+ THEN
+ PushTtok (init, tok) ;
+ Annotate ("%1s(%1d)||qualident procedure/proctype") ;
+ ELSE
+ Annotate ("%1s(%1d)|%1s(%1d)||qualident|type") ;
+ PushTFtok (init, GetType (init), tok) ;
+ END
+END PushTFQualident ;
+
+
+(*
+ CheckModuleQualident - check to see if the beginning ident of the qualident is an
+ imported module.
+*)
+
+PROCEDURE CheckModuleQualident (stopset0: SetOfStop0;
+ stopset1: SetOfStop1;
+ stopset2: SetOfStop2) ;
+VAR
+ name : Name ;
+ init,
+ nextLevel,
+ tok, tokstart: CARDINAL ;
+BEGIN
+ PopTtok (name, tokstart) ;
+ tok := tokstart ;
+ init := RequestSym (tok, name) ;
+ IF IsImported (GetCurrentModule (), init) AND (IsDefImp (init) OR IsModule (init))
+ THEN
+ WHILE IsDefImp (init) OR IsModule (init) DO
+ Expect (periodtok, stopset0, stopset1, stopset2 + SetOfStop2{identtok}) ;
+ StartScope (init) ;
+ Ident (stopset0, stopset1, stopset2) ;
+ PopTtok (name, tok) ;
+ nextLevel := RequestSym (tok, name) ;
+ EndScope ;
+ CheckCanBeImported (init, nextLevel) ;
+ init := nextLevel
+ END ;
+ PushTFQualident (tok, tokstart, init) ;
+ PutIncluded (init)
+ ELSE
+ PushTFQualident (tok, tokstart, init)
+ END
+END CheckModuleQualident ;
+
% module PHBuild end
END PHBuild.
% rules
@@ -541,26 +603,10 @@ ImplementationOrProgramModule := % Pus
Number := Integer | Real =:
-Qualident := % VAR name: Name ;
- Type, Sym, tok: CARDINAL ; %
- Ident
+Qualident := Ident
% IF IsAutoPushOn()
THEN
- PopTtok(name, tok) ;
- Sym := RequestSym (tok, name) ;
- IF IsDefImp(Sym) OR IsModule(Sym)
- THEN
- Expect(periodtok, stopset0, stopset1, stopset2 + SetOfStop2{identtok}) ;
- StartScope(Sym) ;
- Qualident(stopset0, stopset1, stopset2) ;
- (* should we test for lack of ident? *)
- PopTFtok(Sym, Type, tok) ;
- PushTFtok(Sym, Type, tok) ;
- EndScope ;
- PutIncluded(Sym)
- ELSE
- PushTFtok(Sym, GetType(Sym), tok) ;
- END
+ CheckModuleQualident (stopset0, stopset1, stopset2)
ELSE (* just parse qualident *) %
{ "." Ident } % END %
=: