-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathindex.html
358 lines (340 loc) · 18.1 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
<!DOCTYPE html>
<html>
<head>
<title>NFA to DFA Converter</title>
<meta name="description" content="This tool is used to convert non-deterministic finite automata (NFA) to deterministic finite automata (DFA) through an interactive and visual interface.">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/png" href="src/img/favicon.png" />
<link rel="preconnect" href="https://fonts.gstatic.com">
<!-- Import fonts from Google Fonts, such as Roboto -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto&display=swap">
<!-- Material Icons provides in-line action icons, such as those in the right-click edit menu in the canvas -->
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/5.4.55/css/materialdesignicons.min.css">
<link rel="stylesheet" href="src/css/mdi.css">
<!-- Bulma provides a lightweight CSS3 library, including Flexbox grid layouts and button styling -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.2/css/bulma.min.css">
<link rel="stylesheet" href="src/css/main.css">
</head>
<body>
<nav class="navbar is-fixed-top" role="navigation" aria-label="main navigation">
<div class="navbar-brand" style="padding-left: 15px;">
<a class="navbar-item" href="https://joeylemon.github.io/nfa-to-dfa">
<img src="src/img/logo.png" width="100" height="28">
</a>
</div>
<div class="navbar-menu">
<div class="navbar-start">
<a class="navbar-item" href="https://github.com/joeylemon/nfa-to-dfa/blob/master/README.md">
About
</a>
</div>
<div class="navbar-end">
<div class="navbar-item">
<div class="buttons">
<a class="button is-primary" href="https://github.com/joeylemon/nfa-to-dfa">
<strong><i class="mdi mdi-github" aria-hidden="true"></i> Source</strong>
</a>
</div>
</div>
</div>
</div>
</nav>
<div class="notification is-danger" id="warning" style="display: none;">
<button class="delete"></button>
<span class="notification-body"></span>
</div>
<div class="modal help-modal" id="nfa-help-modal">
<div class="modal-background modal-close-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<p class="modal-card-title">How to Build the NFA</p>
<button class="delete modal-close-button" aria-label="close"></button>
</header>
<section class="modal-card-body">
<p>Start building the NFA by <nobr>right-clicking
<i class="mdi mdi-mouse" aria-hidden="true"></i>
</nobr>
on the canvas to create a node. Then, <nobr>right-click
<i class="mdi mdi-mouse" aria-hidden="true"></i>
</nobr>
on the new node to create a transition, edit its properties, or delete
it.
You can <nobr>
pan
<i class="mdi mdi-cursor-pointer" aria-hidden="true"></i>
</nobr>
the canvas by clicking and dragging the mouse. You can <nobr>zoom
<i class="mdi mdi-magnify-plus" aria-hidden="true"></i>
</nobr>
the canvas by hovering the mouse over the canvas and scrolling up or down. Additionally, you can
import a saved NFA or use one from a list of presets.</p>
<p>When creating a transition between nodes, you will be prompted to press a key on your keyboard to
represent the transition symbol. You can use any key, including uppercase values. However, to create
an epsilon (ε) transition, you must press the <img src="src/img/e_key.png" style="height: 15px;"
alt="E" /> key on your keyboard.</p>
<video id="nfa-help-video" loop muted playsinline>
<source src="src/img/nfa-help.mp4" type="video/mp4" />
<source src="src/img/nfa-help.webm" type="video/webm" />
</video>
<p class="subtitle">A video demonstration of the NFA creation process.</p>
</section>
</div>
</div>
<div class="modal help-modal" id="dfa-help-modal">
<div class="modal-background modal-close-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<p class="modal-card-title">How to Convert to a DFA</p>
<button class="delete modal-close-button" aria-label="close"></button>
</header>
<section class="modal-card-body">
<p>After building the NFA, you can then start converting it to a DFA. This
can be
done in <nobr>
steps
<i class="mdi mdi-skip-next" aria-hidden="true"></i>
</nobr>,
<nobr>animated
<i class="mdi mdi-play" aria-hidden="true"></i>
</nobr>,
or all at <nobr>once
<i class="mdi mdi-skip-forward" aria-hidden="true"></i>
</nobr>. You
can revisit previous actions by going backwards <nobr><i class="mdi mdi-skip-previous"
aria-hidden="true"></i></nobr>.
You
may drag nodes around to
reorganize
the visual layout. However, node-editing features are disabled. To
change the DFA, you must
first
change the NFA.
</p>
<video id="dfa-help-video" loop muted playsinline>
<source src="src/img/dfa-help.mp4" type="video/mp4" />
<source src="src/img/dfa-help.webm" type="video/webm" />
</video>
<p class="subtitle">A video demonstration of the DFA conversion process.</p>
</section>
</div>
</div>
<div class="columns is-desktop">
<div class="column">
<div class="card title" id="nfa-title">
<div class="card-content">
<div class="columns">
<div class="column">
<h1>
Non-deterministic
Finite Automaton
(NFA)
</h1>
</div>
<div class="column is-1">
<button class="button orange-button" id="nfa-help-button" aria-haspopup="true"
style="width:100%;" title="View instructions on how to use the NFA builder">
<i class="mdi mdi-36px mdi-help-circle-outline title-help-icon" aria-hidden="true"
style="color: #fff;"></i>
</button>
</div>
</div>
</div>
</div>
<div class="box">
<div class="columns">
<div class="column">
<button class="button orange-button" id="import" style="width:100%;"
title="Import a saved NFA JSON file">
<i class="mdi mdi-upload" aria-hidden="true"></i>Import
</button>
</div>
<div class="column">
<button class="button orange-button" id="export" style="width:100%;"
title="Export the NFA to a JSON file" disabled>
<i class="mdi mdi-download" aria-hidden="true"></i>Export
</button>
</div>
<div class="column">
<div class="dropdown" id="preset-dropdown" style="width:100%;">
<div class="dropdown-trigger" style="width:100%;">
<button class="button orange-button" aria-haspopup="true" aria-controls="dropdown-menu"
style="width:100%;" title="Use a predefined example NFA">
<i class="mdi mdi-format-list-bulleted" aria-hidden="true"></i>Presets
</button>
</div>
<div class="dropdown-menu" role="menu" style="width:100%;">
<div class="dropdown-content">
<a class="dropdown-item" id="preset-1">
<i class="mdi mdi-18px mdi-graph" aria-hidden="true"></i> Preset #1
</a>
<a class="dropdown-item" id="preset-2">
<i class="mdi mdi-18px mdi-graph" aria-hidden="true"></i> Preset #2
</a>
<a class="dropdown-item" id="preset-3">
<i class="mdi mdi-18px mdi-graph" aria-hidden="true"></i> Preset #3
</a>
</div>
</div>
</div>
</div>
<div class="column is-1">
<button class="button orange-button" id="nfa-reset" style="width:100%;"
title="Reset both canvases and start from scratch" disabled>
<i class="mdi mdi-replay" aria-hidden="true" style="margin-right: -5px;"></i>
</button>
</div>
</div>
</div>
<div id="nfa-container" class="box" style="padding:0px; position: relative;">
<canvas id="nfa"></canvas>
</div>
<div class="card block" id="nfa-delta-transitions">
<header class="card-header">
<p class="card-header-title fsa-description">
N = (<em>Q, E, 𝛿, q<sub>0</sub>, F</em> )
</p>
</header>
<div class="card-content">
<div class="fsa-description">
<div class="columns" style="margin-bottom: 0px;">
<div class="column">
<em>Q</em> = <span class="states"></span>
</div>
<div class="column">
<em>E</em> = <span class="alphabet"></span>
</div>
<div class="column">
<em>q<sub>0</sub></em> = <span class="startState"></span>
</div>
<div class="column">
<em>F</em> = <span class="acceptStates"></span>
</div>
</div>
<div>
𝛿 =
</div>
</div>
<table class="table is-bordered is-striped is-fullwidth"></table>
</div>
</div>
</div>
<div class="column">
<div class="card title" id="dfa-title">
<div class="card-content">
<div class="columns">
<div class="column">
<h1>
Deterministic Finite Automaton (DFA)
</h1>
</div>
<div class="column is-1">
<button class="button blue-button" id="dfa-help-button" aria-haspopup="true"
style="width:100%;" title="View instructions on how to use the DFA converter">
<i class="mdi mdi-36px mdi-help-circle-outline title-help-icon" aria-hidden="true"
style="color: #fff;"></i>
</button>
</div>
</div>
</div>
</div>
<div class="box">
<div class="columns">
<div class="column">
<button class="button blue-button" id="step-backward" style="width:100%;"
title="Go to the previous step in the conversion process" disabled>
<i class="mdi mdi-skip-previous" aria-hidden="true"></i>Backward
</button>
</div>
<div class="column">
<button class="button blue-button conversion-button" id="step-forward" style="width:100%;"
title="Go to the next step in the conversion process" disabled>
<i class="mdi mdi-skip-next" aria-hidden="true"></i>Forward
</button>
</div>
<div class="column">
<button class="button blue-button conversion-button" id="animate" style="width:100%;"
title="Automatically walk through the conversion process" disabled>
<i class="mdi mdi-play" aria-hidden="true"></i>Animate
</button>
</div>
<div class="column">
<button class="button blue-button conversion-button" id="complete" style="width:100%;"
title="Perform the conversion completely and view the final result" disabled>
<i class="mdi mdi-skip-forward" aria-hidden="true"></i>Complete
</button>
</div>
<div class="column is-1">
<button class="button blue-button" id="dfa-reset" style="width:100%;"
title="Reset the conversion process" disabled>
<i class="mdi mdi-replay" aria-hidden="true" style="margin-right: -5px;"></i>
</button>
</div>
</div>
</div>
<div id="dfa-container" class="box" style="padding:0px; position: relative;">
<p class="dfa-conversion-step" id="dfa-conversion-step"></p>
<canvas id="dfa"></canvas>
</div>
<div class="card block" id="dfa-delta-transitions">
<header class="card-header">
<p class="card-header-title fsa-description">
M = (<em>Q', E, 𝛿', q<sub>0</sub>', F'</em> )
</p>
</header>
<div class="card-content">
<div class="fsa-description">
<div class="columns" style="margin-bottom: 0px;">
<div class="column">
<em>Q'</em> = <span class="states"></span>
</div>
<div class="column">
<em>E</em> = <span class="alphabet"></span>
</div>
<div class="column">
<em>q<sub>0</sub>'</em> = <span class="startState"></span>
</div>
<div class="column">
<em>F'</em> = <span class="acceptStates"></span>
</div>
</div>
<div>
𝛿 =
</div>
</div>
<table class="table is-bordered is-striped is-fullwidth"></table>
</div>
</div>
</div>
</div>
<div class="card footnotes">
<div class="card-content">
<p>
This application was created by
<nobr><a href="https://github.com/joeylemon">Joey Lemon
<i class="mdi mdi-18px mdi-github" aria-hidden="true"></i></a></nobr>
and <nobr><a href="https://github.com/awillif">Camille Williford
<i class="mdi mdi-18px mdi-github" aria-hidden="true"></i></a></nobr>
during the summer of 2021 for <a href="https://www.linkedin.com/in/michael-berry-a9a5b510/">Dr. Michael
Berry</a> as an independent study project in COSC 493 at the
University of Tennessee. It is an
adaptation of
the <a href="http://alexklibisz.github.io/FSA-Animate">original application</a> by
<nobr><a href="https://github.com/alexklibisz">Alex Klibisz
<i class="mdi mdi-18px mdi-github" aria-hidden="true"></i></a></nobr>
and
<nobr><a href="https://github.com/c-minton">Connor Minton
<i class="mdi mdi-18px mdi-github" aria-hidden="true"></i></a></nobr>, also created for <a
href="https://www.linkedin.com/in/michael-berry-a9a5b510/">Dr.
Michael Berry</a> as an <a
href="https://honors.utk.edu/chancellors-honors-program/program-experience/curriculum/">honors-by-contract
project</a> in COSC 312 during the spring of 2015.
</p>
<a class="button is-primary" href="https://github.com/joeylemon/nfa-to-dfa" style="margin-top: 20px;">
<strong><i class="mdi mdi-github" aria-hidden="true"></i> Source</strong>
</a>
</div>
</div>
<script src="src/js/index.js" type="module"></script>
</body>
</html>