statemachine: parser
authorBernhard Urban <lewurm@gmail.com>
Wed, 24 Mar 2010 13:42:38 +0000 (14:42 +0100)
committerBernhard Urban <lewurm@gmail.com>
Wed, 24 Mar 2010 13:42:40 +0000 (14:42 +0100)
ich habs mir in C nachprogrammiert, zumindest rechnerisch passt es.
visuell ist es irgendwie nicht so toll... :(

spec/sm/parser.pdf
spec/sm/parser.tex
spec/spec.tex

index 85a706107b02f51f130cc8949d83f117b5ce8c15..7afe3df27950506791879e191903b3091f22f319 100644 (file)
Binary files a/spec/sm/parser.pdf and b/spec/sm/parser.pdf differ
index 20589c3cbf3064c0e12d024b310ac9b75d24f455..b02b747e3b2f51a1249c8892281acd92ce0f1a17 100644 (file)
@@ -7,77 +7,47 @@
 \begin{document}
 
 \begin{psmatrix}[mnode=oval, colsep=1.91cm, rowsep=1cm]
-[mnode=R,name=vars]{\shortstack[l]{bool s=F,first=T;\\int z:=0, c,\\\, strich:=0, punkt:=1;\\opcode
-op,opn;}} &
+[mnode=R,name=vars]{\shortstack[l]{int s, z, c,\\\, strich, punkt;\\opcode aktop,opp;}} &
 [name=calc]{\shortstack{\textbf{calc}\\z:=z*10\\+(c-'0');}} &
-[name=null]{\shortstack{\textbf{null}\\op:=DONE;}} \\
+[name=null]{\shortstack{\textbf{null}\\aktop:=DONE;}} \\
 %%
 [mnode=R,name=res]{sys\_res} &
-[name=sign]{\shortstack{\textbf{sign}\\s:=true;}} &
-[name=alu1]{
+[name=sign]{\shortstack{\textbf{sign}\\s:=-1;}} &
+[name=alu]{
        \shortstack{
-               \textbf{ALU1}\\
-               \shortstack[l]{
-                       if(first)\{\\
-                               \, alu(ADD,z*s,strich);\\
-                               \, first:=false;\\
-                       \} else\{\\
-                               \, alu(opd,z*s,strich);\\
-                       \}\\
-                       do\_calc=1;\\
-                       opn=op;
-               }
+               \textbf{ALU}\\
+               siehe Codeschnipsel
        }
 } \\
 %%
-[name=idle]{\shortstack{\textbf{idle}}} &
-[name=read]{\shortstack{\textbf{read char}\\z:=0;\\s:=false;}} &
-[name=alu2]{
-       \shortstack{
-               \textbf{ALU2}\\
-               \shortstack[l]{
-                       if(first)\{\\
-                               \, alu(MUL,z*s,punkt);\\
-                               \, first:=false;\\
-                       \} else\{\\
-                               \, alu(opd,z*s,punkt);\\
-                       \}\\
-                       do\_calc=1;\\
-                       opn=op;
-               }
-       }
-} \\
+[name=idle]{\shortstack{\textbf{idle}\\strich:=0;\\punkt:=1;\\opp:=NOP;}} &
+[name=read]{\shortstack{\textbf{read char}\\z:=0;\\s:=1;}} &
+[name=done]{\shortstack{\textbf{done}}} \\
 %%
 [mnode=R,name=void]{} &
-[name=err]{\shortstack{\textbf{error}}} &
-[name=done]{\shortstack{\textbf{done}}} \\
+[name=err]{\shortstack{\textbf{error}}} \\
 \end{psmatrix}
 
 \psset{arrows=->, shortput=nab}
 
 \ncline[linestyle=dotted]{res}{idle}
 \ncline[linestyle=dotted]{void}{err}
-\ncarc[arcangle=10]{done}{idle}
+\ncarc[arcangle=24]{done}{idle}
 \ncarc[arcangle=0]{err}{idle}
 
 \ncarc[arcangle=0]{idle}{read}\ncput*[npos=.50]{do\_it$\uparrow$}
-
+\nccurve[angleA=45,angleB=75,ncurvA=2,ncurvB=2]{read}{read}\ncput*{' '}
 \ncarc[arcangle=0]{read}{sign}\ncput*[npos=.50]{'-'}
-\ncarc[arcangle=0]{sign}{calc}
-\ncarc[arcangle=35]{read}{calc}\ncput*[npos=.35]{c = '0'\dots{}'9'}
-\nccircle[angle=0]{calc}{.8cm}\ncput*{c = '0'\dots{}'9'}
-
-\ncarc[arcangle=15]{calc}{alu1}\ncput*[npos=.50]{op = '+','-'}
-\ncarc[arcangle=-5]{calc}{alu2}\ncput*[npos=.30]{op = '*','/'}
 
-\ncarc[arcangle=0]{calc}{null}\ncput*[npos=.50]{'\textbackslash 0'}
-
-\ncarc[arcangle=0]{null}{alu1}\ncput*[npos=.50]{opd in ['+','-']}
-\ncarc[arcangle=48]{null}{alu2}\ncput*[npos=.80]{opd in ['*','/']}
+\ncarc[arcangle=0]{sign}{calc}
+\ncarc[arcangle=50]{read}{calc}\ncput*[npos=.35]{c = '0'\dots{}'9'}
+\nccircle[angleA=-20]{calc}{.78cm}\ncput*[npos=0.39]{c = '0'\dots{}'9'}
+\nccircle[angleA=80,angleB=0,loopsize=0]{calc}{.66cm}\ncput*{' '}
 
-\ncarc[arcangle=0]{alu1}{read}\ncput*[npos=.50]{calc\_done$\uparrow$}
-\ncarc[arcangle=20]{alu2}{read}\ncput*[npos=.50]{calc\_done$\uparrow$}
+\ncarc[arcangle=0]{calc}{alu}\ncput*[npos=.50]{aktop = '+','-','*','/'}
+\ncarc[arcangle=0]{calc}{null}\ncput*[npos=.50]{aktop = '\textbackslash 0'}
+\ncarc[arcangle=0]{null}{alu}
 
-\ncarc[arcangle=80]{alu1}{done}\ncput*[npos=.50]{op == DONE}
-\ncarc[arcangle=-60]{alu2}{done}\ncput*[npos=.66]{op == DONE}
+\ncarc[arcangle=0]{alu}{read}\ncput*[npos=.50]{calc\_done$\uparrow$}
+\ncarc[arcangle=0]{alu}{done}\ncput*[npos=.50]{aktop == DONE}
 \end{document}
index 1d8bb580895712af0e36d7e91a94919897fe15b0..88e0045663ffc6e0462c25c41e06617f52ff2c0d 100644 (file)
@@ -364,6 +364,49 @@ Modul wird dadurch getriggert das anliegende Zeichen in den Buffer zu \"ubernehm
 \label{fig:parser}
 \end{figure}
 
+\begin{lstlisting}
+procedure exec() {
+       z := z*s;
+       switch(opp) {
+               case NOP: 
+                       if(aktop != '\0')
+                               c1();
+                       break;
+               case '-':
+                       z := z * (-1);
+               case '+':
+                       c1();
+                       break;
+
+               case '/':
+               case '*':
+                 if(aktop in ['+','-','\0']) {
+                         alu(opp, z, punkt);
+                         do_calc = 1;
+                         while(calc_done == 0);
+
+                         alu(ADD, punkt, strich);
+                         punkt = 1;
+                 }
+                 else if (aktop in ['*','/']) {
+                         alu(opp, z, punkt);
+                 }
+                 break;
+       }
+       do_calc = 1;
+       opp = aktop;
+}
+
+procedure c1() {
+       if(aktop in ['+','-','\0']) {
+               alu(ADD, z, strich);
+       }
+       else if (aktop in ['*','/']) {
+               alu(MUL, z, punkt);
+       }
+}
+\end{lstlisting}
+
 \begin{itemize}
 \item \textbf{idle}: Das Modul ist unt\"atig und wartet auf eine steigende Flanke von \emph{do\_it}.
 
@@ -374,17 +417,17 @@ History Modul angefordert.
 
 \item \textbf{calc}: Zeichen f\"ur Zeichen wird eingelesen und die Zahl wird daraus berechnet.
 
-\item \textbf{ALU1/2}: Punkt- und Strichrechnungen m\"ussen getrennt behandelt werden, daher ergibt
-sich dieses Konstrukt.
+\item \textbf{ALU}: Punkt- und Strichrechnungen m\"ussen getrennt behandelt werden, daher ergibt
+sich dieses Konstrukt im Codebeispiel.
 
 \item \textbf{null}: Sonderbehandlung ist n\"otig wenn die Expression mit '\textbackslash 0'
 abgeschlossen wird.
 
-\item \textbf{done}: In diesem Zustand wird das Ergebnis das sich je nach \emph{opd} in
+\item \textbf{done}: In diesem Zustand wird das Ergebnis das sich je nach \emph{opp} in
 \emph{strich} oder \emph{punkt}  befindet als String in den Ergebnisbuffer des History Modules
 geschrieben und danach wird \emph{finnnnnished\_result} f\"ur einen Zyklus auf high gesetzt.
 
-\item \textbf{error}: Zwecks \"ubersichtlichkeit wurden die Transitionen zu diesem Zustand
+\item \textbf{error}: Zwecks \"Ubersichtlichkeit wurden die Transitionen zu diesem Zustand
 vernachl\"assigt. Dieser Zustand wird erreicht sobald ein Grammatikfehler oder ein Fehler der ALU
 auftritt. Es wird der String ``Error'' in den Ergebnisbuffer geschrieben und
 \emph{finnnnnished\_result} wird f\"ur einen Zyklus auf high gesetzt.
@@ -394,7 +437,7 @@ auftritt. Es wird der String ``Error'' in den Ergebnisbuffer geschrieben und
 \subsection{Bin/Dez-Converter}
 
 \subsection{ALU}
-opcodes: NOP, ADD, SUB, MUL, DIV, DONE (als enum)
+opcodes: NOP, ADD, MUL, DIV, DONE (als enum)
 
 \subsection{Display}