572 \addplot[cyan,mark=*, mark options={fill=white}] table {re-java9.data}; |
572 \addplot[cyan,mark=*, mark options={fill=white}] table {re-java9.data}; |
573 \end{axis} |
573 \end{axis} |
574 \end{tikzpicture} |
574 \end{tikzpicture} |
575 \end{tabular} |
575 \end{tabular} |
576 \end{center} |
576 \end{center} |
|
577 |
|
578 %\end{document} |
577 \newpage |
579 \newpage |
578 |
580 |
579 |
581 \noindent |
580 |
582 For the calculation below, I prefer to use the more ``mathematical'' |
581 |
583 notation for regular expressions. Therefore let us first look at this |
|
584 notation and the corresponding Scala code. |
|
585 |
|
586 \begin{center} |
|
587 \begin{tabular}{r@{\hspace{10mm}}l} |
|
588 ``mathematical'' notation & \\ |
|
589 for regular expressions & Scala code\smallskip\\ |
|
590 $\ZERO$ & \texttt{ZERO}\\ |
|
591 $\ONE$ & \texttt{ONE}\\ |
|
592 $c$ & \texttt{CHAR(c)}\\ |
|
593 $\sum rs$ & \texttt{ALTs(rs)}\\ |
|
594 $\prod rs$ & \texttt{SEQs(rs)}\\ |
|
595 $r^*$ & \texttt{STAR(r)} |
|
596 \end{tabular} |
|
597 \end{center} |
|
598 |
|
599 \noindent |
|
600 My own convention is that \texttt{rs} stands for a list of regular |
|
601 expressions. Also of note is that these are \textbf{all} regular |
|
602 expressions in Main 3 and the template file defines them as the |
|
603 (algebraic) datatype \texttt{Rexp}. A confusion might arise from the |
|
604 fact that there is also some shorthand notation for some regular |
|
605 expressions, namely |
|
606 |
|
607 \begin{lstlisting}[xleftmargin=10mm,numbers=none] |
|
608 def ALT(r1: Rexp, r2: Rexp) = ALTs(List(r1, r2)) |
|
609 def SEQ(r1: Rexp, r2: Rexp) = SEQs(List(r1, r2)) |
|
610 \end{lstlisting} |
|
611 |
|
612 \noindent |
|
613 Since these are functions, everything of the form \texttt{ALT(r1, r2)} |
|
614 will immediately be translated into the regular expression |
|
615 \texttt{ALTs(List(r1, r2))} (similarly for \texttt{SEQ}). Maybe even |
|
616 more confusing is that Scala allows one to define |
|
617 \textit{extensions} that provide an even shorter notation for |
|
618 \texttt{ALT} and \texttt{SEQ}, namely |
|
619 |
|
620 \begin{center} |
|
621 \begin{tabular}{lclcl} |
|
622 \texttt{r1} $\sim$ \texttt{r2} & $\dn$ & \texttt{SEQ(r1, r2)} & $\dn$ & \texttt{SEQs(List(r1, r2))}\\ |
|
623 \texttt{r1} $|$ \texttt{r2} & $\dn$ & \texttt{ALT(r1, r2)} & $\dn$ & \texttt{ALTs(List(r1, r2))}\\ |
|
624 \end{tabular} |
|
625 \end{center} |
|
626 |
|
627 \noindent |
|
628 The right hand sides are the fully expanded definitions. |
|
629 The reason for this even shorter notation is that in the mathematical |
|
630 notation one often writes |
|
631 |
|
632 \begin{center} |
|
633 \begin{tabular}{lcl} |
|
634 $r_1 \;\cdot\; r_2$ & $\dn$ & $\prod\;[r_1, r_2]$\\ |
|
635 $r_1 + r_2$ & $\dn$ & $\sum\;[r_1, r_2]$ |
|
636 \end{tabular} |
|
637 \end{center} |
|
638 |
|
639 \noindent |
|
640 The first one is for binary \textit{sequence} regular expressions and |
|
641 the second for binary \textit{alternative} regular expressions. |
|
642 The regex in question in the shorthand notation is $(a + 1)\cdot a$, |
|
643 which is the same as |
|
644 |
|
645 \[ |
|
646 \prod\; [\Sigma\,[a, 1], a] |
|
647 \] |
|
648 |
|
649 \noindent |
|
650 or in Scala code |
|
651 |
|
652 \[ |
|
653 \texttt{(CHAR('a') | ONE)} \;\sim\; \texttt{CHAR('a')} |
|
654 \] |
|
655 |
|
656 \noindent |
|
657 Using the mathematical notation, the definition of $\textit{der}$ is |
|
658 given by the rules: |
|
659 |
|
660 \begin{center} |
|
661 \begin{tabular}{llcl} |
|
662 (1) & $\textit{der}\;c\;(\ZERO)$ & $\dn$ & $\ZERO$\\ |
|
663 (2) & $\textit{der}\;c\;(\ONE)$ & $\dn$ & $\ZERO$\\ |
|
664 (3) & $\textit{der}\;c\;(d)$ & $\dn$ & $\textit{if}\; c = d\;\textit{then} \;\ONE \; \textit{else} \;\ZERO$\\ |
|
665 (4) & $\textit{der}\;c\;(\sum\;[r_1,..,r_n])$ & $\dn$ & $\sum\;[\textit{der}\;c\;r_1,..,\textit{der}\;c\;r_n]$\\ |
|
666 (5) & $\textit{der}\;c\;(\prod\;[])$ & $\dn$ & $\ZERO$\\ |
|
667 (6) & $\textit{der}\;c\;(\prod\;r\!::\!rs)$ & $\dn$ & $\textit{if}\;\textit{nullable}(r)$\\ |
|
668 & & & $\textit{then}\;(\prod\;(\textit{der}\;c\;r)\!::\!rs) + (\textit{der}\;c\;(\prod rs))$\\ |
|
669 & & & $\textit{else}\;(\prod\;(\textit{der}\;c\;r)\!::\! rs)$\\ |
|
670 (7) & $\textit{der}\;c\;(r^*)$ & $\dn$ & $(\textit{der}\;c\;r)\cdot (r^*)$\\ |
|
671 \end{tabular} |
|
672 \end{center} |
|
673 |
|
674 |
|
675 |
|
676 \noindent |
|
677 Let's finally do the calculation for the derivative of the regular |
|
678 expression with respect to the letter $a$ (in red is in each line which |
|
679 regular expression is ana-lysed): |
|
680 |
|
681 \begin{center} |
|
682 \begin{tabular}{cll} |
|
683 & $\textit{der}(a, \textcolor{red}{(a + 1) \cdot a})$ & by (6) and since $a + 1$ is nullable\\ |
|
684 $\dn$ & $(\textit{der}(a, \textcolor{red}{a + 1})\cdot a) + \textit{der}(a, \,\prod\,[a])$ & by (4)\\ |
|
685 $\dn$ & $((\textit{der}(a, \textcolor{red}{a}) + \texttt{der}(a, \ONE))\cdot a) + \textit{der}(a, \,\prod\,[a])$& by (3)\\ |
|
686 $\dn$ & $((\ONE + \texttt{der}(a, \textcolor{red}{1}))\cdot a) + \textit{der}(a, \,\prod\,[a])$ & by (2)\\ |
|
687 $\dn$ & $((\ONE + \ZERO)\cdot a) + \textit{der}(a, \textcolor{red}{\prod\,[a]})$ & by (6) and $a$ not being nullable\\ |
|
688 $\dn$ & $((\ONE + \ZERO)\cdot a) + \prod\,[\texttt{der}(a, \textcolor{red}{a})]$ & by (3)\\ |
|
689 $\dn$ & $((\ONE + \ZERO)\cdot a) + \prod\,[\ONE]$ \\ |
|
690 \end{tabular} |
|
691 \end{center} |
|
692 |
|
693 \noindent |
|
694 Translating this result back into Scala code gives you |
|
695 |
|
696 \[ |
|
697 \texttt{ALT(\,} \underbrace{\texttt{(ONE | ZERO)} \sim \texttt{CHAR('a')}}_{(\textbf{1} + \textbf{0})\,\cdot\, a}\;,\;\underbrace{\texttt{SEQs(List(ONE))}}_{\prod\,[\textbf{1}]}\texttt{)} |
|
698 \] |
|
699 |
|
700 |
582 |
701 |
583 \end{document} |
702 \end{document} |
584 |
703 |
585 |
704 |
586 |
705 |