Lexical Analysis Finite Automata - University of...
-
Upload
vuongxuyen -
Category
Documents
-
view
218 -
download
0
Transcript of Lexical Analysis Finite Automata - University of...
![Page 1: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/1.jpg)
#1
Lexical AnalysisLexical Analysis
Finite AutomataFinite Automata
(Part 2 of 2)(Part 2 of 2)
![Page 2: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/2.jpg)
#2
PA1, PA1c
• You can submit new rosetta.yada files for PA1, so you can fix errors from PA1c.
![Page 3: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/3.jpg)
#3
Reading Quiz Results
• Average: 2.11 / 4.00 = 53%• Standard Dev: 1.00• Goal was 85%• Particularly troubling was that two-thirds of
the class missed “Speedcoding” ...– ... which was the name of the assigned reading.
You didn't even have to read the paper to get it, you just had to look at the assignment list.
• This gives me no confidence that the majority of students are reading for comprehension.
![Page 4: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/4.jpg)
#4
Cunning Plan
• Regular expressions provide a concise notation for string patterns
• Use in lexical analysis requires small extensions– To resolve ambiguities– To handle errors
• Good algorithms known (next)– Require only single pass over the input– Few operations per character (table lookup)
![Page 5: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/5.jpg)
#5
One-Slide Summary
• Finite automata are formal models of computation that can accept regular languages corresponding to regular expressions.
• Nondeterministic finite automata (NFA) feature epsilon transitions and multiple outgoing edges for the same input symbol.
• Regular expressions can be converted to NFAs.• Tools will generate DFA-based lexer code for
you from regular expressions.
![Page 6: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/6.jpg)
#6
Finite Automata
• Regular expressions = specification• Finite automata = implementation
• A finite automaton consists of– An input alphabet – A set of states S– A start state n– A set of accepting states F µ S
– A set of transitions state input state
![Page 7: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/7.jpg)
#7
Finite Automata
• Transition
s1 a s2
• Is readIn state s1 on input “a” go to state s2
• If end of input (or no transition possible)– If in accepting state ) accept
– Otherwise ) reject
![Page 8: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/8.jpg)
#8
Finite Automata State Graphs
• A state
• The start state
• An accepting state
• A transitiona
![Page 9: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/9.jpg)
#9
A Simple Example
• A finite automaton that accepts only “1”
• A finite automaton accepts a string if we can follow transitions labeled with the characters in the string from the start to some accepting state
1
![Page 10: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/10.jpg)
#10
Another Simple Example
• A finite automaton accepting any number of 1’s followed by a single 0
• Alphabet {0,1}
• Check that “1110” is accepted but “110…” is not
0
1
![Page 11: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/11.jpg)
#11
And Another Example• Alphabet = {0,1}• What language does this recognize?
0
1
0
1
0
1
![Page 12: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/12.jpg)
#12
And A Fourth Example
• Alphabet still = { 0, 1 }
• The operation of the automaton is not completely defined by the input– On input “11” the automaton could be in either
state
1
1
![Page 13: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/13.jpg)
#13
Epsilon Moves
• Another kind of transition: -moves
• Machine can move from state A to state B without reading input
A B
![Page 14: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/14.jpg)
#14
Deterministic and Nondeterministic Automata
• Deterministic Finite Automata (DFA)– One transition per input per state – No -moves
• Nondeterministic Finite Automata (NFA)– Can have multiple transitions for one input in a
given state– Can have -moves
• Finite automata have finite memory– Need only to encode the current state
![Page 15: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/15.jpg)
#15
Execution of Finite Automata
• A DFA can take only one path through the state graph– Completely determined by input
• NFAs can choose– Whether to make -moves– Which of multiple transitions for a single input to
take
![Page 16: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/16.jpg)
#16
Acceptance of NFAs
• An NFA can get into multiple states
• Input:
0
1
1
0
1 0 1
• Rule: NFA accepts if it can get in a final state
![Page 17: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/17.jpg)
#17
NFA vs. DFA (1)
• NFAs and DFAs recognize the same set of languages (regular languages)– They have the same
expressive power
• DFAs are easier to implement– There are no choices
to consider
![Page 18: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/18.jpg)
#18
NFA vs. DFA (2)
• For a given language the NFA can be simpler than the DFA
01
0
0
01
0
1
0
1
NFA
DFA
• DFA can be exponentially larger than NFA
![Page 19: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/19.jpg)
#19
Natural Languages
• This North Germanic language is generally mutually intelligible with Norwegian and Danish, and descends from Old Norse of the Viking Era to a modern speaking population of about 10 million people. The language contains two genders, nouns that are rarely inflected, and a typical subject-verb-object ordering. Its home country is one of the largest music exporters of the modern world, often targeting English-speaking audiences. Bands such as Ace of Base, ABBA and Roxette are examples, with over 420m combined album sales.
![Page 20: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/20.jpg)
#20
Unnatural Languages
• This stack-based structured computer programming language appeared in the 1970's and went on to influence PostScript and RPL. It is typeless and is often used in bootloaders and embedded applications. Example:
25 10 * 50 +
• Simple C Program:int floor5(int v) { return (v < 6) ? 5 : (v – 1); }
• Same program in this Language:: FLOOR5 ( n -- n' ) DUP 6 < IF DROP 5 ELSE 1 – THEN ;
![Page 21: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/21.jpg)
#21
Regular Expressions to Finite Automata
• High-level sketch
Regularexpressions
NFA
DFA
LexicalSpecification
Table-driven Implementation of DFA
![Page 22: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/22.jpg)
#22
Regular Expressions to NFA (1)
• For each kind of rexp, define an NFA– Notation: NFA for rexp A
A
• For
• For input aa
![Page 23: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/23.jpg)
#23
Regular Expressions to NFA (2)
• For ABA B
• For A | B
A
B
![Page 24: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/24.jpg)
#24
Regular Expressions to NFA (3)
• For A*A
![Page 25: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/25.jpg)
#25
Example of RegExp -> NFA Conversion
• Consider the regular expression(1 | 0)* 1
• The NFA is
1C E
0D F
B
G
A H 1I J
![Page 26: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/26.jpg)
#26
Overarching PlanOverarching Plan
RegularRegularexpressionsexpressions
NFANFA
DFADFA
LexicalLexicalSpecificationSpecification
Table-driven Table-driven Implementation of DFAImplementation of DFA
Thomas Cole – Evening in Arcady (1843)
![Page 27: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/27.jpg)
#27
NFA to DFA: The Trick
• Simulate the NFA• Each state of DFA
= a non-empty subset of states of the NFA
• Start state = the set of NFA states reachable through -moves
from NFA start state
• Add a transition S a S’ to DFA iff– S’ is the set of NFA states reachable from the
states in S after seeing the input a• considering -moves as well
![Page 28: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/28.jpg)
#28
NFA ! DFA Example
10 1
A BC
D
E
FG H I J
ABCDHI
FGABCDHI
EJGABCDHI
0
1
0
10 1
![Page 29: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/29.jpg)
#29
NFA ! DFA: Remark
• An NFA may be in many states at any time
• How many different states?
• If there are N states, the NFA must be in some subset of those N states
• How many non-empty subsets are there?– 2N - 1 = finitely many
![Page 30: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/30.jpg)
#30
Implementation
• A DFA can be implemented by a 2D table T– One dimension is “states”– Other dimension is “input symbols”
– For every transition Si a Sk define T[i,a] = k
• DFA “execution”– If in state Si and input a, read T[i,a] = k and skip
to state Sk
– Very efficient
![Page 31: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/31.jpg)
#31
Table Implementation of a DFA
S
T
U
0
1
0
10 1
UTUUTTUTS10
![Page 32: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/32.jpg)
#32
Implementation (Cont.)
• NFA ! DFA conversion is at the heart of tools such as flex or ocamllex
• But, DFAs can be huge
• In practice, flex-like tools trade off speed for space in the choice of NFA and DFA representations
![Page 33: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/33.jpg)
#33
PA2: Lexical Analysis
• Correctness is job #1.– And job #2 and #3!
• Tips on building large systems:– Keep it simple– Design systems that can be tested – Don’t optimize prematurely– It is easier to modify a working system than to
get a system working
![Page 34: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/34.jpg)
#34
Lexical Analyzer Generator
• Tools like lex and flex and ocamllex will build lexers for you!
• You will use this for PA2
• I’ll explain ocamllex; others are similar– See PA2 documentation
Lexer SourceCode
LexicalAnalyzerGenerator
List of Regexpswith code snippets
![Page 35: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/35.jpg)
#35
Ocamllex “lexer.mll” file
{(* raw preamble code
type declarations, utility functions, etc. *)}let re_namei = rei
rule normal_tokens = parsere1 { token1 }
| re2 { token2 }and specialtokens = parse| ren { tokenn }
![Page 36: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/36.jpg)
#36
Example “lexer.mll”
{type token = Tok_Integer of int (* 123 *)
| Tok_Divide (* / *)}let digit = [‘0’ – ‘9’] rule initial = parse
‘/’ { Tok_Divide }| digit digit* { let token_string = Lexing.lexeme lexbuf in
let token_val = int_of_string token_string in Tok_Integer(token_val) } | _ { Printf.printf “Error!\n”; exit 1 }
![Page 37: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/37.jpg)
#37
Adding Winged Comments
{type token = Tok_Integer of int (* 123 *)
| Tok_Divide (* / *)}let digit = [‘0’ – ‘9’] rule initial = parse
“//” { eol_comment }| ‘/’ { Tok_Divide }| digit digit* { let token_string = Lexing.lexeme lexbuf in
let token_val = int_of_string token_string in Tok_Integer(token_val) } | _ { Printf.printf “Error!\n”; exit 1 }
and eol_comment = parse ‘\n’ { initial lexbuf }| _ { eol_comment lexbuf }
![Page 38: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/38.jpg)
#38
Using Lexical Analyzer Generators
$ ocamllex lexer.mll45 states, 1083 transitions, table size 4602 bytes
(* your main.ml file … *) let file_input = open_in “file.cl” inlet lexbuf = Lexing.from_channel file_input inlet token = Lexer.initial lexbuf inmatch token with| Tok_Divide -> printf “Divide Token!\n”| Tok_Integer(x) -> printf “Integer Token = %d\n” x
![Page 39: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/39.jpg)
#39
How Big Is PA2?
• The reference “lexer.mll” file is 88 lines– Perhaps another 20 lines to keep track of input
line numbers– Perhaps another 20 lines to open the file and get
a list of tokens– Then 65 lines to serialize the output– I’m sure it’s possible to be smaller!
• Conclusion:– This isn’t a code slog, it’s about careful
forethought and precision.
![Page 40: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/40.jpg)
#40
Warning!
• You may be tempted to use OCaml for PA2 based on that demo.
• However, you probably want to save OCaml for one of the harder assignments later.
![Page 41: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/41.jpg)
![Page 42: Lexical Analysis Finite Automata - University of Michiganweb.eecs.umich.edu/~weimerw/2012-4610/lectures/weimer-pl-05.pdf · • Tools will generate DFA-based lexer code for ... NFA](https://reader031.fdocuments.us/reader031/viewer/2022022522/5b31291c7f8b9ab5728bfdc9/html5/thumbnails/42.jpg)
#42
Homework• PA1 due• Textbook Reading, CD Reading