Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
lfa:lab03-dfa-regexp [2021/10/09 19:31] pdmatei |
lfa:lab03-dfa-regexp [2021/10/16 18:57] (current) pdmatei |
||
---|---|---|---|
Line 31: | Line 31: | ||
\\ | \\ | ||
- | ===== 4.2. Regex implementation ===== | + | ===== 4.2. Writing Regular Expressions ===== |
+ | |||
+ | **4.2.1.** Write a regular expression for the language of arithmetic expressions containing +, * and numbers. | ||
+ | **Hint:** you can abbreviate $ 0 \cup 1 \cup ... \cup 9 $ by $ [0-9] $ | ||
+ | |||
+ | **4.2.2.** Write a regular expression for $ L = \{ \omega \text{ in } \text{{0,1}} ^* \text{ | EVERY sequence of two or more consecutive zeros appears before ANY sequence of two or more consecutive ones} \} $ | ||
+ | |||
+ | **4.2.3.** Write a DFA for $ L(( 10 \cup 0) ^* ( 1 \cup \epsilon )) $ | ||
+ | |||
+ | **4.2.4.** Write a regular expression which generates the accepted language of A: | ||
+ | |||
+ | {{:lfa:graf1.png?200|}} | ||
+ | |||
+ | **4.2.5.** Simplify the regular expression you found. | ||
+ | |||
+ | **4.2.6.** Describe as precisely as possible the language generated by $math[(1 \cup 1(01^*0)1)^*] | ||
+ | |||
+ | |||
+ | ===== 4.3. Regex implementation (Python) ===== | ||
==== Inheritance and isinstance ==== | ==== Inheritance and isinstance ==== | ||
Line 78: | Line 96: | ||
</code> | </code> | ||
- | **4.2.1.** Write a class hierarchy for Regular Expressions, and add the ''__str__'' function for each of them. Implement a constructor which reads a Regular Expression in **Prenex form**, from a string. The prenex form is illustrated below via examples: | + | **4.3.1.** Write a class hierarchy for Regular Expressions, and add the ''__str__'' function for each of them. Implement a constructor which reads a Regular Expression in **Prenex form**, from a string. The prenex form is illustrated below via examples: |
<code Python> | <code Python> | ||
Line 98: | Line 116: | ||
<hidden More hints> | <hidden More hints> | ||
- | The following table illustrates the string parsing and stack contents for the last example. | + | The following table illustrates the string parsing and stack contents (ADT style) for the last example. |
^ String contents ^ Stack ^ | ^ String contents ^ Stack ^ | ||
| ''CONCAT STAR UNION a b STAR c'' | Void | | | ''CONCAT STAR UNION a b STAR c'' | Void | | ||
+ | | ''STAR UNION a b STAR c'' | Push(Concat(?,?),Void) | | ||
+ | | ''UNION a b STAR c'' | Push(Star(?), Push(Concat(?,?),Void)) | | ||
+ | | ''a b STAR c'' | Push(Union(?,?), Push(Star(?), Push(Concat(?,?),Void))) | | ||
+ | | ''b STAR c'' | Push(a, Push(Union(?,?), Push(Star(?), Push(Concat(?,?),Void)))) | | ||
+ | | ''b STAR c'' | Push(Union(a,?), Push(Star(?), Push(Concat(?,?),Void))) | | ||
+ | | ''STAR c'' | Push(b, Push(Union(a,?), Push(Star(?), Push(Concat(?,?),Void)))) | | ||
+ | | ''STAR c'' | Push(Union(a,b), Push(Star(?), Push(Concat(?,?),Void))) | | ||
+ | | ''STAR c'' | Push(Star(Union(a,b)), Push(Concat(?,?),Void))) | | ||
+ | | ''STAR c'' | Push(Concat(Star(Union(a,b)),?),Void))) | | ||
+ | | ''c'' | Push(Star(?),Push(Concat(Star(Union(a,b)),?),Void)))) | | ||
+ | | | Push(c, Push(Star(?),Push(Concat(Star(Union(a,b)),?),Void))))) | | ||
+ | | | Push(Star(c),Push(Concat(Star(Union(a,b)),?),Void)))) | | ||
+ | | | Push(Concat(Star(Union(a,b)),Star(c)),Void)))) | | ||
+ | |||
+ | The string has been consumed and the stack holds one expression, thus the result is: ''Concat(Star(Union(a,b)),Star(c))''. | ||
</hidden> | </hidden> | ||
+ | ===== 4.4. Regex implementation (Haskell) ===== | ||
- | ===== 4.3. Writing Regular Expressions ===== | + | **4.4.1.** Implement the ADT ''Regex''. |
- | + | ||
- | + | ||
- | **4.3.1.** Write a regular expression for the language of arithmetic expressions containing +, * and numbers. | + | |
- | **Hint:** you can abbreviate $ 0 \cup 1 \cup ... \cup 9 $ by $ [0-9] $ | + | |
- | + | ||
- | **4.3.2.** Write a regular expression for $ L = \{ \omega \text{ in } \text{{0,1}} ^* \text{ | every sequence of consecutive zeros appears before ANY sequence of consecutive ones} \} $ | + | |
- | + | ||
- | **4.3.3.** Write a DFA for $ L(( 10 \cup 0) ^* ( 1 \cup \epsilon )) $ | + | |
- | + | ||
- | **4.3.4.** Write a regular expression which generates the accepted language of A: | + | |
- | + | ||
- | {{:lfa:graf1.png?200|}} | + | |
- | + | ||
- | **4.3.5.** Simplify the regular expression you found. | + | |
- | **4.3.6.** Describe as precisely as possible the language generated by $math[(1 \cup 1(01^*0)1)^*] | + | **4.4.2.** Enrol the type in class ''Show''. |
+ | **4.4.3.** Write a function which takes a string containing a regex in prenex form (see the Python exercises) and returns a ''Regex''. ***Hint:** use two mutually recursive functions and see the hints regarding the stack from the Python implementation section. | ||