// // File GRANAL.RF // // Project: GR // $use Access; $use Arithm; $use Compare; $use Dos; $use StdIO; $use GrPrn; $func NTWithout (e.NTL) (e.Rules) = e.Dead; $func EnvWith (e.NTL) (e.Env) = e.Env; $func FindAlive e.Rules = e.Alive; $func IterAlive (e.Alive) (e.Rules) = e.Alive; $func NextAlive (e.Alive) (e.Rules) = e.NextAlive; $func FindReachable e.Rules = e.Reachable; $func IterReachable (e.Reachable) (e.Rules) = e.Reachable; $func NextReachable (e.Reachable) (e.Rules) = e.NextReachable; $func FindNullable e.Rules = e.Nullable; $func IterNullable (e.Nullable) (e.Rules) = e.Nullable; $func NextNullable (e.Nullable) (e.Rules) = e.NextNullable; $func? IsNullableRhs (e.Nullable) (e.Rhs) = ; $func FindStarters (e.Nullable) (e.Rules) = e.SEnv; $func IterStarters (e.Nullable) (e.SEnv) (e.Rules) = e.SEnv; $func NextStarters (e.Nullable) (e.SEnv) (e.Rules) = e.SEnv; $func RhsListStarters (e.Nullable) (e.SEnv) (e.L) = e.Starters; $func RhsStarters (e.Nullable) (e.SEnv) (eR) = e.Starters; $func FindFollowers (e.Nullable) (e.SEnv) (e.Rules) = e.FEnv; $func IterFollowers (e.Nullable) (e.SEnv) (e.FEnv) (e.Rules) = e.SEnv; $func NextFollowers (e.Nullable) (e.SEnv) (e.FEnv) (e.Rules) = e.SEnv; $func RhsListFollowers s.N (e.Nullable) (e.SEnv) (e.FEnv) (e.L) = e.FEnv; $func RhsFollowers sN (e.Nullable) (e.SEnv) (e.FEnv) (eR) = e.FEnv; $func UpdateFollowers sN (e.Nullable) (e.SEnv) (e.FEnv) sX (e.Rest) = e.FEnv; $func PrintAnnGrammar (e.Nullable) (e.SEnv) (e.FEnv) (e.Rules) = ; $func PrintAnnRules sC (e.Nullable) (e.SEnv) (e.FEnv) (e.S) sN (eL) = ; $func SetUnion (eX) (eY) = eU; $func MkSet e.List = e.Set; $func ExtractNT e.RhsList = e.NTList; $func ExtractNTRhs e.Rhs = e.NTList; $func RulesToEnv e.Rules = e.Env; $func LookupEnv sN (e.Env) = eV; $func UpdateEnv sN (eV) (e.Env) = e.Env; Analyze (e.Tokens) (e.Rules) = // , :: e.Alive, :: e.Dead, { e.Dead : ; , ,, ; }, :: e.Reachable, :: e.Unreachable, { e.Unreachable : ; , ,, ; }, :: e.Nullable, { e.Nullable : ; , ,; }, e.Rules : (s.Start e) e, ("$START" ( (N s.Start) (T "$END") )) e.Rules :: e.Rules_, :: e.SEnv, , e.SEnv : t e.SEnv1, ,, :: e.FEnv, , e.FEnv : t e.FEnv1, :: e.FEnv1, ,, , ; NTWithout (e.NTL) (e.Rules) = e.Rules : { = ; (s.N e) e.Rest = { e.NTL : e s.N e, = ; = s.N ; }; }; EnvWith (e.NTL) (e.Env) = e.Env : { = ; (sN (eV)) e.Rest = { e.NTL : e sN e = (sN (eV)) ; = ; }; }; FindAlive e.Rules = ; IterAlive (e.Alive) (e.Rules) = , :: e.NextAlive, { e.Alive : e.NextAlive, = e.Alive; = ; }; NextAlive (e.Alive) (e.Rules) = e.Rules : { = e.Alive; (s.N e.L) e.Rest = { e.L : e (eR) e, # \{ eR : e (N sX) e, # \{ e.Alive : e sX e; }; }, = ) (e.Rest)>; = ; }; }; FindReachable e.Rules = e.Rules : (s.Start e) e, ; IterReachable (e.Reachable) (e.Rules) = , :: e.NextReachable, { e.Reachable : e.NextReachable, = e.Reachable; = ; }; NextReachable (e.Reachable) (e.Rules) = e.Rules : { = e.Reachable; (s.N e.L) e.Rest = { e.Reachable : e s.N e = > :: e.NewReachable, :: e.Reachable, = ; = ; }; }; FindNullable e.Rules = ; IterNullable (e.Nullable) (e.Rules) = , :: e.NextNullable, { e.Nullable : e.NextNullable, = e.Nullable; = ; }; NextNullable (e.Nullable) (e.Rules) = e.Rules : { = e.Nullable; (s.N e.L) e.Rest = { e.L : e (eR) e, , :: e.Nullable, = ; = ; }; }; IsNullableRhs (e.Nullable) (eR) = # \{ eR : e (T sX) e; eR : e (N sX) e, # \{ e.Nullable : e sX e; }; }; FindStarters (e.Nullable) (e.Rules) = :: e.SEnv, ; IterStarters (e.Nullable) (e.SEnv) (e.Rules) = , :: e.NextSEnv, { e.SEnv : e.NextSEnv, = e.SEnv; = ; }; NextStarters (e.Nullable) (e.SEnv) (e.Rules) = e.Rules : { = e.SEnv; (s.N e.L) e.Rest = :: e.NewStarters, :: e.OldStarters, :: e.NewStarters, :: e.SEnv, = ; }; RhsListStarters (e.Nullable) (e.SEnv) (e.L) = e.L : { = ; (eR) e.Rest = ) ( )>; }; RhsStarters (e.Nullable) (e.SEnv) (eR) = eR : { = ; (T sX) e.Rest = sX; (N sX) e.Rest = :: e.XStarters, { e.Nullable : e sX e = )>; = e.XStarters; }; }; FindFollowers (e.Nullable) (e.SEnv) (e.Rules) = :: e.FEnv, ; IterFollowers (e.Nullable) (e.SEnv) (e.FEnv) (e.Rules) = , :: e.NextFEnv, { e.FEnv : e.NextFEnv, = e.FEnv; = ; }; NextFollowers (e.Nullable) (e.SEnv) (e.FEnv) (e.Rules) = e.Rules : { = e.FEnv; (s.N e.L) e.Rest = :: e.FEnv, = ; }; RhsListFollowers s.N (e.Nullable) (e.SEnv) (e.FEnv) (e.L) = e.L : { = e.FEnv; (eR) e.Rest = :: e.FEnv, ; }; RhsFollowers sN (e.Nullable) (e.SEnv) (e.FEnv) (eR) = eR : { = e.FEnv; (T sX) e.Rest = ; (N sX) e.Rest, :: e.FEnv, = ; }; UpdateFollowers sN (e.Nullable) (e.SEnv) (e.FEnv) sX (e.Rest) = :: e.OldFollowers, :: e.NewFollowers, :: e.NewFollowers, { = )>; = e.NewFollowers; } :: e.NewFollowers, ; PrintAnnGrammar (e.Nullable) (e.SEnv) (e.FEnv) (e.Rules) = e.Rules : { = ; (sN eL) e.Rest = ; }; PrintAnnRules sC (e.Nullable) (e.SEnv) (e.FEnv) (e.S) sN (eL) = eL : { = ; (eR) e.Rest = :: e.Sel, { = )>; = e.Sel; } :: e.Sel, , { e.S : e s0 e, e.Sel : e s0 e = , ; = ; }, :: e.S, , = ; }; SetUnion { () (eY) = eY; (eX) () = eX; (eX) (eY), eX : sA eX1, eY : sB eY1 = { = sA ; = sB ; = sA ; }; }; MkSet eS = :: sLen, { = eS; =
:: sK, :: eS1, :: eS2, )( )>; }; ExtractNT { = ; (eR) e.Rest = ; }; ExtractNTRhs { e (N s.N) e.Rest = s.N ; e.Rest = ; }; RulesToEnv { = ; (sN e) e.Rest = (sN ()) ; }; LookupEnv sN (e (sN (eV)) e) = eV; UpdateEnv sN (eV) (e1 (sN (e)) e2) = e1 (sN (eV)) e2;