1100 lines
15 KiB
HTML
1100 lines
15 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
<meta name="description" content="">
|
|
<meta name="author" content="Eelco Visser">
|
|
<meta name="generator" content="Jekyll v3.8.5">
|
|
<title>Lecture 8b: More Parsing Algorithms</title>
|
|
<!-- <base href="/2021"> -->
|
|
|
|
<!--link rel="canonical" href="https://getbootstrap.com/docs/4.3/examples/starter-template/"-->
|
|
|
|
<link rel="icon" href="../img/logo/pl_ico2_2B3_icon.ico" type="image/x-icon">
|
|
|
|
<!-- Bootstrap core CSS -->
|
|
<!--link href="https://getbootstrap.com/docs/4.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"-->
|
|
|
|
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
|
|
|
|
|
|
|
|
<style>
|
|
.bd-placeholder-img {
|
|
font-size: 1.125rem;
|
|
text-anchor: middle;
|
|
-webkit-user-select: none;
|
|
-moz-user-select: none;
|
|
-ms-user-select: none;
|
|
user-select: none;
|
|
}
|
|
|
|
@media (min-width: 768px) {
|
|
.bd-placeholder-img-lg {
|
|
font-size: 3.5rem;
|
|
}
|
|
}
|
|
</style>
|
|
<!-- Custom styles for this template -->
|
|
<link href="../css/main.css" rel="stylesheet">
|
|
<link href="../css/borders-responsive.css" rel="stylesheet">
|
|
|
|
<link rel="stylesheet" href="../css/pl.css">
|
|
</head>
|
|
<body>
|
|
|
|
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
|
|
|
|
<a class="navbar-brand" href="../index.html">
|
|
TU Delft | CS4200
|
|
</a>
|
|
|
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
|
|
<span class="navbar-toggler-icon"></span>
|
|
</button>
|
|
|
|
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
|
|
<ul class="navbar-nav mr-auto">
|
|
|
|
|
|
|
|
|
|
|
|
<li class="nav-item active">
|
|
<a class="nav-link" href="../lectures/index.html" tabindex="-1" aria-disabled="true">Lectures</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="nav-item active">
|
|
<a class="nav-link" href="../homework/index.html" tabindex="-1" aria-disabled="true">Homework</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="nav-item active">
|
|
<a class="nav-link" href="../project/index.html" tabindex="-1" aria-disabled="true">Project</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="nav-item active">
|
|
<a class="nav-link" href="../news/index.html" tabindex="-1" aria-disabled="true">News</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="nav-item active">
|
|
<a class="nav-link" href="../blog/index.html" tabindex="-1" aria-disabled="true">Blog</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
</nav>
|
|
|
|
|
|
<div class="container">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="row">
|
|
<div class="col-sm-12 col-md-12 col-lg-12 col-xl-12">
|
|
|
|
<a href="../lectures/2021/08-more-parsing/CS4200-2020-8-parsing.pdf">
|
|
<img class="border border-dark" width="100%" src="../lectures/2021/08-more-parsing/title.png"/>
|
|
</a>
|
|
|
|
|
|
<div class="mt-3 mb-3 pt-3 pb-3 text-dark border-top border-bottom border-grey">
|
|
<div class="text-dark font-weight-bold">
|
|
<h1>
|
|
|
|
Lecture 8b: More Parsing Algorithms
|
|
|
|
</h1>
|
|
</div>
|
|
<div>
|
|
|
|
Eelco Visser
|
|
|
|
|
|
</div>
|
|
<div>
|
|
|
|
|
|
Lecture
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| <a class="text-primary" href="../lectures/2021/08-more-parsing/CS4200-2020-8-parsing.pdf">PDF</a>
|
|
|
|
|
|
</div>
|
|
<div>
|
|
October 14, 2021
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-sm-12 col-md-12 col-lg-9 border-lg-right border-grey">
|
|
<p>Note: This lecture is for the interested student and will not be part of the exam material.</p>
|
|
|
|
<p>In this lecture we study two more parsing algorithms.</p>
|
|
|
|
<h3 id="predictive-parsing">Predictive Parsing</h3>
|
|
|
|
<p>Predictive parsing is a top-down parsing approach in which the stack contains the symbols to parse.
|
|
Actions consist in either popping a terminal off the stack when that coincides with the next input token, or in predicting a production for the non-terminal that is on top of the stack and replacing that non-terminal with the symbols on the right-hand side of the predicted production.
|
|
We discuss how to derive an LL(1) automaton from a grammar based on the FIRST and FOLLOW set for that grammar.</p>
|
|
|
|
<h3 id="generalized-parsing">Generalized Parsing</h3>
|
|
|
|
<p>Generalized LR parsing is a generalization of the LR parsing algorithm that we studied last week.
|
|
The LR parsing algorithm is deterministic.
|
|
At each point there is a single shift or reduce action that can take place.
|
|
That means, that an LR parser cannot handle shift/reduce conflicts in the parse table.
|
|
A Generalized-LR parser handles such conflicts by forking the stack and continuing to parse the input with two parsers in parallel.
|
|
This may lead to multiple parsers to be active simultaneously.
|
|
When two parsers end up in the same state again, their stacks are merged.</p>
|
|
|
|
<h3 id="other-parsing-algorithms">Other Parsing Algorithms</h3>
|
|
|
|
<p>There are many more parsing algorithms than we can study in this course.
|
|
In the references a couple of pointers to other sources about parsing algorithms.
|
|
These include <code class="language-plaintext highlighter-rouge">ALL(*)</code>, the algorithm that is at the basis of the popular ANTLR parser generator,
|
|
parsing expression grammars (PEGs) another popular parsing approach,
|
|
and parsing combinators in Haskell and Scala.</p>
|
|
|
|
<!-- The [PDF](/2021lectures/2020/08-more-parsing/CS4200-2020-8-parsing-builds.pdf) of the slides of the lecture with builds. -->
|
|
|
|
<h3 id="slides">Slides</h3>
|
|
|
|
<ul>
|
|
<li><a href="../lectures/2021/08-more-parsing/CS4200-2020-8-parsing.pdf">Slides</a></li>
|
|
<li><a href="../lectures/2021/08-more-parsing/CS4200-2020-8-parsing-builds.pdf">Slides with builds</a></li>
|
|
</ul>
|
|
|
|
<h3 id="references">References</h3>
|
|
|
|
|
|
|
|
|
|
<ul class="list-group list-group-flush pb-3">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="list-group-item pl-lg-0 border-0 pb-0">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="bd-callout border-primary pl-3">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div>
|
|
<a name="ParrHF14"></a>
|
|
|
|
<a class="font-weight-bold text-dark" target="_blank" href="http://doi.acm.org/10.1145/2660193.2660202">Adaptive LL(*) parsing: the power of dynamic analysis</a>
|
|
|
|
</div>
|
|
|
|
<div class="font-weight-light text-secondary" style="font-size:90%;">
|
|
<a class="text-secondary" href="http://www.cs.usfca.edu/~parrt/">Terence John Parr</a>, <a class="text-secondary" href="https://researchr.org/alias/sam-harwell">Sam Harwell</a>, <a class="text-secondary" href="https://researchr.org/alias/kathleen-fisher">Kathleen Fisher</a>.
|
|
</div>
|
|
|
|
<div class="font-weight-light text-secondary" style="font-size:90%;">
|
|
|
|
|
|
OOPSLA 2014
|
|
|
|
|
|
|
|
|
|
|
|
[<a class="text-secondary" href="http://doi.acm.org/10.1145/2660193.2660202" target="_blank">doi</a>, <a class="text-secondary" target="_blank" href="https://researchr.org/publication/ParrHF14/bibtex">bib</a>, <a href="https://researchr.org/publication/ParrHF14" class="text-secondary" target="_blank">researchr</a>]
|
|
|
|
<!-- ParrHF14 -->
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="list-group-item pl-lg-0 border-0 pb-0">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="bd-callout border-success pl-3">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div>
|
|
<a name="MoorsPO2008"></a>
|
|
|
|
Parser combinators in Scala
|
|
|
|
</div>
|
|
|
|
<div class="font-weight-light text-secondary" style="font-size:90%;">
|
|
<a class="text-secondary" href="http://www.google.com">Adriaan Moors</a>, <a class="text-secondary" href="https://researchr.org/alias/f.-piessens"> F. Piessens</a>, <a class="text-secondary" href="http://lampwww.epfl.ch/~odersky/">Martin Odersky</a>.
|
|
</div>
|
|
|
|
<div class="font-weight-light text-secondary" style="font-size:90%;">
|
|
|
|
|
|
|
|
|
|
|
|
Technical report , Department of Computer Science, K.U. Leuven, 2008
|
|
|
|
|
|
[<a class="text-secondary" target="_blank" href="https://researchr.org/publication/MoorsPO2008/bibtex">bib</a>, <a href="https://researchr.org/publication/MoorsPO2008" class="text-secondary" target="_blank">researchr</a>]
|
|
|
|
<!-- MoorsPO2008 -->
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="list-group-item pl-lg-0 border-0 pb-0">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="bd-callout border-info pl-3">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div>
|
|
<a name="AhoLSU2006"></a>
|
|
|
|
Compilers: Principles, Techniques, and Tools (2nd Edition)
|
|
|
|
</div>
|
|
|
|
<div class="font-weight-light text-secondary" style="font-size:90%;">
|
|
<a class="text-secondary" href="https://researchr.org/alias/a.-v.-aho">A. V. Aho</a>, <a class="text-secondary" href="https://researchr.org/alias/m.-s.-lam"> M. S. Lam</a>, <a class="text-secondary" href="https://researchr.org/alias/r.-sethi">R. Sethi</a>, <a class="text-secondary" href="https://researchr.org/alias/j.-d.-ullman"> J. D. Ullman</a>.
|
|
</div>
|
|
|
|
<div class="font-weight-light text-secondary" style="font-size:90%;">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[<a class="text-secondary" target="_blank" href="https://researchr.org/publication/AhoLSU2006/bibtex">bib</a>, <a href="https://researchr.org/publication/AhoLSU2006" class="text-secondary" target="_blank">researchr</a>]
|
|
|
|
<!-- AhoLSU2006 -->
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="list-group-item pl-lg-0 border-0 pb-0">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="bd-callout border-primary pl-3">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div>
|
|
<a name="Ford04-PEG"></a>
|
|
|
|
<a class="font-weight-bold text-dark" target="_blank" href="http://doi.acm.org/10.1145/964001.964011">Parsing expression grammars: a recognition-based syntactic foundation</a>
|
|
|
|
</div>
|
|
|
|
<div class="font-weight-light text-secondary" style="font-size:90%;">
|
|
<a class="text-secondary" href="https://researchr.org/alias/bryan-ford">Bryan Ford</a>.
|
|
</div>
|
|
|
|
<div class="font-weight-light text-secondary" style="font-size:90%;">
|
|
|
|
|
|
POPL 2004
|
|
|
|
|
|
|
|
|
|
|
|
[<a class="text-secondary" href="http://doi.acm.org/10.1145/964001.964011" target="_blank">doi</a>, <a class="text-secondary" target="_blank" href="https://researchr.org/publication/Ford04-PEG/bibtex">bib</a>, <a href="https://researchr.org/publication/Ford04-PEG" class="text-secondary" target="_blank">researchr</a>]
|
|
|
|
<!-- Ford04-PEG -->
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="list-group-item pl-lg-0 border-0 pb-0">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="bd-callout border-info pl-3">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div>
|
|
<a name="Appel2002"></a>
|
|
|
|
Modern Compiler Implementation in Java, 2nd edition
|
|
|
|
</div>
|
|
|
|
<div class="font-weight-light text-secondary" style="font-size:90%;">
|
|
<a class="text-secondary" href="http://www.cs.princeton.edu/~appel/">Andrew W. Appel</a>.
|
|
</div>
|
|
|
|
<div class="font-weight-light text-secondary" style="font-size:90%;">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[<a class="text-secondary" target="_blank" href="https://researchr.org/publication/Appel2002/bibtex">bib</a>, <a href="https://researchr.org/publication/Appel2002" class="text-secondary" target="_blank">researchr</a>]
|
|
|
|
<!-- Appel2002 -->
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="list-group-item pl-lg-0 border-0 pb-0">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="bd-callout border-danger pl-3">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div>
|
|
<a name="Hutton92"></a>
|
|
|
|
Higher-Order Functions for Parsing
|
|
|
|
</div>
|
|
|
|
<div class="font-weight-light text-secondary" style="font-size:90%;">
|
|
<a class="text-secondary" href="http://www.cs.nott.ac.uk/~gmh/">Graham Hutton</a>.
|
|
</div>
|
|
|
|
<div class="font-weight-light text-secondary" style="font-size:90%;">
|
|
|
|
JFP 2(3) 1992
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[<a class="text-secondary" target="_blank" href="https://researchr.org/publication/Hutton92/bibtex">bib</a>, <a href="https://researchr.org/publication/Hutton92" class="text-secondary" target="_blank">researchr</a>]
|
|
|
|
<!-- Hutton92 -->
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
</div>
|
|
<div class="col-sm-12 col-md-12 col-lg-3 col-xl-3 " >
|
|
<div class="sticky-top top70 d-none d-lg-block d-xl-block">
|
|
<div class="pb4 mb3 border-bottom border-grey ">
|
|
<nav>
|
|
<ul class="pagination justify-content-left">
|
|
|
|
<li class="page-item">
|
|
<a class="page-link" href="8.html">
|
|
«
|
|
</a>
|
|
</li>
|
|
|
|
<li class="page-item">
|
|
<a class="page-link" href="../lectures/index.html">
|
|
^
|
|
</a>
|
|
</li>
|
|
|
|
<li class="page-item">
|
|
<a class="page-link" href="9.html">»</a>
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
<ul id="my_toc" class="toc list-group list-group-flush d-none d-lg-block d-xl-block p-0 ml-0 mt-3">
|
|
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="8b.html#predictive-parsing">Predictive Parsing</a></li>
|
|
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="8b.html#generalized-parsing">Generalized Parsing</a></li>
|
|
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="8b.html#other-parsing-algorithms">Other Parsing Algorithms</a></li>
|
|
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="8b.html#slides">Slides</a></li>
|
|
<li class="list-group-item pl-0 ml-0 border-0 pl-0 pt-0 pb-1 pr-0 m-0 mr-3"><a href="8b.html#references">References</a></li>
|
|
</ul>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="border-top border-bottom border-grey mt-3 pt-3">
|
|
<nav>
|
|
<ul class="pagination justify-content-center">
|
|
|
|
<li class="page-item">
|
|
<a class="page-link" href="8.html">
|
|
Previous
|
|
</a>
|
|
</li>
|
|
|
|
|
|
<li class="page-item">
|
|
<a class="page-link" href="9.html">Next</a>
|
|
</li>
|
|
|
|
<li class="page-item">
|
|
<a class="page-link" href="../lectures/index.html">
|
|
Index
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<!-- Optional JavaScript -->
|
|
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
|
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
|
|
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
|
|
|
|
</body>
|
|
</html>
|