Permalink
Browse files

Merge branch 'master' of github.com:johang88/haskellinjavascript

  • Loading branch information...
2 parents 9b28540 + 9e16ffd commit b831891d54c71352c2bbfd8fdfcb6a26fbdbb42f Mattis Jeppsson committed May 18, 2010
Showing with 21 additions and 10 deletions.
  1. +13 −2 hs/Prelude.hs
  2. +8 −8 rapport/kapitel/resultat.tex
View
@@ -47,8 +47,11 @@ foldr1 f xs = case xs of
filter _ [] = []
filter f (x:xs ) | f x = x : filter f xs
| otherwise = filter f xs
+
+iterate f x = f x : iterate f (f x)
-iterate f x = f x : iterate f x
+zipWith f (a:as) (b:bs) = f a b : zipWith f as bs
+zipWith _ _ _ = []
head xs = case xs of
(x:_) -> x
@@ -75,6 +78,14 @@ data Int = I# Int#
(>) (I# i1) (I# i2) = i1 ># i2
+(<) (I# i1) (I# i2) = i1 <# i2
+
+(<=) (I# i1) (I# i2) = i1 <=# i2
+
+(>=) (I# i1) (I# i2) = i1 >=# i2
+
+(%) (I# i1) (I# i2) = I# (remInt# i1 i2)
+
stepDebug = stepDebug#
data Maybe a = Just a | Nothing
@@ -133,4 +144,4 @@ enumFromThen e1 e2 = enumHelper (e2-e1) (const False) e1
enumFromTo e1 e3 = enumHelper 1 (>e3) e1
-enumFromThenTo e1 e2 e3 = enumHelper (e2-e1) (>e3) e1
+enumFromThenTo e1 e2 e3 = enumHelper (e2-e1) (>e3) e1
@@ -11,7 +11,7 @@ \subsection{Parser}
Haskell är ett svårt språk att parsa då det inte är kontextfritt på grund av att kodens mening beror på blanksteg,
Haskell tillåter även egendefinierade operatorer vilket också kan påverka kodens mening.
-För att parsa indatan använder vi ett bibliotek för att bygga parsers kallat JSParse \citep{jsparse}.
+För att parsa indatan använder vi ett bibliotek för att bygga parsers kallat JSParse.
JSParse ger oss ett antal funktioner som vi använder för att definiera grammatiken och konvertera den till vår interna struktur.
Som figur \ref{fig:parser_steg} visar, består parsern av tre mindre parsers, den första är en parser som hittar kommentarer och tar bort dessa.
@@ -69,7 +69,7 @@ \subsubsection{Steg 2 - Konvertera till kontextfri}
som är specificerad i haskellstandarden. Därefter användads en annan algoritm från standarden för att sätta in måsvingar och semikolon på rätt platser. % samma, vilken algoritm, TODO
När de två algoritmerna är klara sätts koden ihop igen och skickas vidare till nästa steg.
-En regel är att ett inre block inte får vara mindre indenterat än det omslutande blocket, exempelivs:
+Ett exempel på en regel är att ett inre block inte får vara mer indenderat än ett omslutande block.
\begin{lstlisting}
case x of
True -> ...
@@ -89,15 +89,15 @@ \subsubsection{Steg 2 - Konvertera till kontextfri}
För att översätta detta korrekt kommer parsern ihåg den aktuella nästlingsnivån av \emph{let}-uttryck och var deras repsektive \emph{in}-uttryck befinner sig.
Den avslutande måsvingen sätts in där ett matchande \emph{in}-uttryck påträffas.
-Ett exempel som inte översätts korrekt:
+Det finns även uttryck som inte översätts korrekt, exempelvis:
\begin{lstlisting}
[x | let x = 2]
\end{lstlisting}
Den korrekta översättningen är:
\begin{lstlisting}
[x | let { x = 2 }]
\end{lstlisting}
-Men det blir:
+Men i parsern blir det:
\begin{lstlisting}
[ x | let { x = 2 ] }
\end{lstlisting}
@@ -110,14 +110,13 @@ \subsubsection{Steg 3 - Skapa AST}
Samtidigt som koden tolkas byggs en AST upp. Parsern består av en liten parser för varje grammatisk regel som är definerad i haskellstandarden.
Dessa parsers kombineras ihop för att bilda den slutgiltliga parsern. Det resulterar i ett träd av parsers, en parser för hela programmet som har flera mindre parsers under sig.
-Exempel:
-Definitionen i haskellstandarden:
+Exempel på grammatik definierad i Haskellstandarden.
\begin{lstlisting}
gdrhs -> gd = exp [gdrhs]
rhs -> exp [where decls]
| gdrhs [where decls]
\end{lstlisting}
-Dess respektive parsers:
+Desss motsvarande parsers.
\begin{lstlisting}
var gdrhs = gdrhs_action(
repeat1(gdrhs_fix_list_action(sequence(ws(gd),
@@ -144,7 +143,8 @@ \subsubsection{Steg 3 - Skapa AST}
\subsubsection{JSParse}
Vi använder en modifierad version av JSParse där vi har korrigerat två fel och lagt till fler parsers. Felen vi korrigerade var i \emph{butnot}-parsern och i \emph{choice}-parserns cachefunktion.
\emph{Choice}-parsern cachade resultat från parsers som misslyckades och det cachade resultatet användes i senare parsers,
-vi löste det med en stackbaserad cache där cachen för en parser som misslyckas raderas.
+vi löste det med en stackbaserad cache där cachen för en parser som misslyckas raderas.
+JSParse har andra problem som vi inte löst, exempelvis att det inte rapporterar rad- och kolumn-nummer eller parsningsfel korrekt, detta gör att vi inte får bra felmeddelanden.
Parsers som vi har lagt till:
\begin{enumerate}

0 comments on commit b831891

Please sign in to comment.