Skip to content

Commit bad2940

Browse files
authored
Merge pull request #1110 from CakeML/efficient-cases-peg
2 parents a645a67 + d8e4b55 commit bad2940

9 files changed

+443
-441
lines changed

compiler/parsing/cmlPEGScript.sml

+19-15
Original file line numberDiff line numberDiff line change
@@ -318,18 +318,22 @@ Definition cmlPEG_def[nocompute]:
318318
(bindNT nE);
319319
seql [tokeq CaseT; pnt nE; tokeq OfT; pnt nPEs]
320320
(bindNT nE)]);
321-
(mkNT nE',
322-
choicel [seql [tokeq RaiseT; pnt nE'] (bindNT nE');
323-
pegf (pnt nElogicOR) (bindNT nE');
324-
seql [tokeq IfT; pnt nE; tokeq ThenT; pnt nE;
325-
tokeq ElseT; pnt nE'] (bindNT nE')]);
326321
(mkNT nPEs,
327-
choicel [seql [pnt nPE'; tokeq BarT; pnt nPEs] (bindNT nPEs);
328-
pegf (pnt nPE) (bindNT nPEs)]);
329-
(mkNT nPE, seql [pnt nPattern; tokeq DarrowT; pnt nE]
330-
(bindNT nPE));
331-
(mkNT nPE', seql [pnt nPattern; tokeq DarrowT; pnt nE']
332-
(bindNT nPE'));
322+
seql [pnt nPattern; tokeq DarrowT; pnt nPE] (bindNT nPEs));
323+
(mkNT nPE,
324+
choicel [seql [tokeq IfT; pnt nE; tokeq ThenT; pnt nE;
325+
tokeq ElseT; pnt nPE]
326+
(bindNT nPE);
327+
seql [tokeq CaseT; pnt nE; tokeq OfT; pnt nPEs]
328+
(bindNT nPE);
329+
seql [tokeq FnT; pnt nPattern; tokeq DarrowT; pnt nE]
330+
(bindNT nPE);
331+
seql [tokeq RaiseT; pnt nPE] (bindNT nPE);
332+
seql [pnt nElogicOR; pnt nPEsfx] (bindNT nPE)]);
333+
(mkNT nPEsfx,
334+
choicel [seql [tokeq HandleT; pnt nPEs] (bindNT nPEsfx);
335+
seql [tokeq BarT; pnt nPEs] (bindNT nPEsfx);
336+
pegf (empty []) (bindNT nPEsfx)]);
333337
(mkNT nAndFDecls,
334338
peg_linfix (mkNT nAndFDecls) (pnt nFDecl) (tokeq AndT));
335339
(mkNT nFDecl,
@@ -704,7 +708,7 @@ val npeg0_rwts =
704708
“nEmult”, “nEadd”, “nElistop”, “nErel”, “nEcomp”,
705709
“nEbefore”,
706710
“nEtyped”, “nElogicAND”, “nElogicOR”, “nEhandle”,
707-
“nE”, “nE'”, “nElist1”,
711+
“nE”, “nPE”, “nPEs”, “nElist1”,
708712
“nSpecLine”
709713
]
710714

@@ -732,14 +736,14 @@ val topo_nts = [“nV”, “nTyvarN”, “nTypeDec”, “nTypeAbbrevDec”,
732736
“nTbase”, “nPTbase”, “nTbaseList”, “nDType”, “nPType”,
733737
“nListOps”, “nRelOps”, “nPtuple”, “nPbase”, “nPapp”,
734738
“nPcons”, “nPas”, “nPattern”,
735-
“nPatternList”, “nPbaseList1”, “nPE”,
736-
nPE'”, “nPEs”, “nMultOps”, “nLetDec”, “nLetDecs”,
739+
“nPatternList”, “nPbaseList1”,
740+
“nPEs”, “nMultOps”, “nLetDec”, “nLetDecs”,
737741
“nFQV”,
738742
“nFDecl”, “nAddOps”, “nCompOps”, “nOpID”,
739743
“nEliteral”, “nEbase”, “nEapp”,
740744
“nEmult”, “nEadd”, “nElistop”, “nErel”,
741745
“nEcomp”, “nEbefore”, “nEtyped”, “nElogicAND”,
742-
“nElogicOR”, “nEhandle”, “nE”, “nE'”,
746+
“nElogicOR”, “nPE”, “nPEsfx”, “nEhandle”, “nE”,
743747
“nType”, “nTypeList1”, “nTypeList2”,
744748
“nEseq”, “nElist1”, “nDtypeDecl”,
745749
“nOptTypEqn”,

compiler/parsing/proofs/cmlNTPropsScript.sml

+12-25
Original file line numberDiff line numberDiff line change
@@ -561,29 +561,6 @@ Proof
561561
simp[Once EXTENSION, EQ_IMP_THM] >> dsimp[]
562562
QED
563563

564-
Theorem firstSet_nE':
565-
firstSet cmlG (NT(mkNT nE')::rest) =
566-
firstSet cmlG [NT (mkNT nEbase)] ∪ {IfT; RaiseT}
567-
Proof
568-
simp[SimpLHS, firstSetML_eqn] >>
569-
ntac 2 (simp[Once firstSetML_def, cmlG_applied, cmlG_FDOM]) >>
570-
simp[Once EXTENSION, EQ_IMP_THM] >> dsimp[]
571-
QED
572-
573-
Theorem firstSetML_nE'[simp]:
574-
mkNT nConstructorName ∉ sn ∧ mkNT nUQConstructorName ∉ sn ∧
575-
mkNT nEbase ∉ sn ∧ mkNT nFQV ∉ sn ∧ mkNT nV ∉ sn ∧ mkNT nEapp ∉ sn ∧
576-
mkNT nEmult ∉ sn ∧ mkNT nEadd ∉ sn ∧ mkNT nErel ∉ sn ∧ mkNT nEcomp ∉ sn ∧
577-
mkNT nEbefore ∉ sn ∧ mkNT nEtyped ∉ sn ∧ mkNT nElogicAND ∉ sn ∧
578-
mkNT nElogicOR ∉ sn ∧ mkNT nE' ∉ sn ∧ mkNT nElistop ∉ sn ∧
579-
mkNT nEliteral ∉ sn
580-
581-
firstSetML cmlG sn (NT (mkNT nE')::rest) = firstSet cmlG [NN nE']
582-
Proof
583-
ntac 2 (simp[Once firstSetML_def, cmlG_applied, cmlG_FDOM, firstSet_nE']) >>
584-
simp[Once EXTENSION, EQ_IMP_THM] >> dsimp[]
585-
QED
586-
587564
Theorem firstSet_nElist1[simp]:
588565
firstSet cmlG (NT (mkNT nElist1)::rest) = firstSet cmlG [NT (mkNT nE)]
589566
Proof
@@ -721,6 +698,14 @@ Proof
721698
simp[SimpLHS, Once firstSet_NT, cmlG_FDOM, cmlG_applied] >> simp[]
722699
QED
723700

701+
Theorem firstSet_nPEsfx[simp]:
702+
firstSet cmlG (NN nPEsfx :: rest) =
703+
BarT INSERT HandleT INSERT firstSet cmlG rest
704+
Proof
705+
simp[SimpLHS, Once firstSet_NT, cmlG_FDOM, cmlG_applied,
706+
nullable_PEsfx] >> SET_TAC[]
707+
QED
708+
724709
Theorem NOTIN_firstSet_nV[simp]:
725710
CommaT ∉ firstSet cmlG [NN nV] ∧ LparT ∉ firstSet cmlG [NN nV] ∧
726711
RparT ∉ firstSet cmlG [NN nV] ∧ UnderbarT ∉ firstSet cmlG [NN nV] ∧
@@ -750,7 +735,8 @@ Theorem NOTIN_firstSet_nV[simp]:
750735
TypeT ∉ firstSet cmlG [NN nV] ∧
751736
SemicolonT ∉ firstSet cmlG [NN nV] ∧ ColonT ∉ firstSet cmlG [NN nV] ∧
752737
StructureT ∉ firstSet cmlG [NN nV] ∧ WordT w ∉ firstSet cmlG [NN nV] ∧
753-
SymbolT "::" ∉ firstSet cmlG [NN nV]
738+
SymbolT "::" ∉ firstSet cmlG [NN nV] ∧
739+
HandleT ∉ firstSet cmlG [NN nV]
754740
Proof
755741
simp[firstSet_nV] >> simp[validPrefixSym_def]
756742
QED
@@ -790,7 +776,8 @@ Theorem NOTIN_firstSet_nFQV[simp]:
790776
TypeT ∉ firstSet cmlG [NN nFQV] ∧
791777
UnderbarT ∉ firstSet cmlG [NN nFQV] ∧
792778
ValT ∉ firstSet cmlG [NN nFQV] ∧
793-
WordT w ∉ firstSet cmlG [NN nFQV]
779+
WordT w ∉ firstSet cmlG [NN nFQV] ∧
780+
HandleT ∉ firstSet cmlG [NN nV]
794781
Proof
795782
simp[firstSet_nFQV]
796783
QED

0 commit comments

Comments
 (0)