Skip to content
This repository
Browse code

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

  • Loading branch information...
commit b831891d54c71352c2bbfd8fdfcb6a26fbdbb42f 2 parents 9b28540 + 9e16ffd
Mattis Jeppsson authored

Showing 2 changed files with 21 additions and 10 deletions. Show diff stats Hide diff stats

  1. +13 2 hs/Prelude.hs
  2. +8 8 rapport/kapitel/resultat.tex
15 hs/Prelude.hs
@@ -47,8 +47,11 @@ foldr1 f xs = case xs of
47 47 filter _ [] = []
48 48 filter f (x:xs ) | f x = x : filter f xs
49 49 | otherwise = filter f xs
  50 +
  51 +iterate f x = f x : iterate f (f x)
50 52
51   -iterate f x = f x : iterate f x
  53 +zipWith f (a:as) (b:bs) = f a b : zipWith f as bs
  54 +zipWith _ _ _ = []
52 55
53 56 head xs = case xs of
54 57 (x:_) -> x
@@ -75,6 +78,14 @@ data Int = I# Int#
75 78
76 79 (>) (I# i1) (I# i2) = i1 ># i2
77 80
  81 +(<) (I# i1) (I# i2) = i1 <# i2
  82 +
  83 +(<=) (I# i1) (I# i2) = i1 <=# i2
  84 +
  85 +(>=) (I# i1) (I# i2) = i1 >=# i2
  86 +
  87 +(%) (I# i1) (I# i2) = I# (remInt# i1 i2)
  88 +
78 89 stepDebug = stepDebug#
79 90
80 91 data Maybe a = Just a | Nothing
@@ -133,4 +144,4 @@ enumFromThen e1 e2 = enumHelper (e2-e1) (const False) e1
133 144
134 145 enumFromTo e1 e3 = enumHelper 1 (>e3) e1
135 146
136   -enumFromThenTo e1 e2 e3 = enumHelper (e2-e1) (>e3) e1
  147 +enumFromThenTo e1 e2 e3 = enumHelper (e2-e1) (>e3) e1
16 rapport/kapitel/resultat.tex
@@ -11,7 +11,7 @@ \subsection{Parser}
11 11 Haskell är ett svårt språk att parsa då det inte är kontextfritt på grund av att kodens mening beror på blanksteg,
12 12 Haskell tillåter även egendefinierade operatorer vilket också kan påverka kodens mening.
13 13
14   -För att parsa indatan använder vi ett bibliotek för att bygga parsers kallat JSParse \citep{jsparse}.
  14 +För att parsa indatan använder vi ett bibliotek för att bygga parsers kallat JSParse.
15 15 JSParse ger oss ett antal funktioner som vi använder för att definiera grammatiken och konvertera den till vår interna struktur.
16 16
17 17 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}
69 69 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
70 70 När de två algoritmerna är klara sätts koden ihop igen och skickas vidare till nästa steg.
71 71
72   -En regel är att ett inre block inte får vara mindre indenterat än det omslutande blocket, exempelivs:
  72 +Ett exempel på en regel är att ett inre block inte får vara mer indenderat än ett omslutande block.
73 73 \begin{lstlisting}
74 74 case x of
75 75 True -> ...
@@ -89,7 +89,7 @@ \subsubsection{Steg 2 - Konvertera till kontextfri}
89 89 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.
90 90 Den avslutande måsvingen sätts in där ett matchande \emph{in}-uttryck påträffas.
91 91
92   -Ett exempel som inte översätts korrekt:
  92 +Det finns även uttryck som inte översätts korrekt, exempelvis:
93 93 \begin{lstlisting}
94 94 [x | let x = 2]
95 95 \end{lstlisting}
@@ -97,7 +97,7 @@ \subsubsection{Steg 2 - Konvertera till kontextfri}
97 97 \begin{lstlisting}
98 98 [x | let { x = 2 }]
99 99 \end{lstlisting}
100   -Men det blir:
  100 +Men i parsern blir det:
101 101 \begin{lstlisting}
102 102 [ x | let { x = 2 ] }
103 103 \end{lstlisting}
@@ -110,14 +110,13 @@ \subsubsection{Steg 3 - Skapa AST}
110 110 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.
111 111 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.
112 112
113   -Exempel:
114   -Definitionen i haskellstandarden:
  113 +Exempel på grammatik definierad i Haskellstandarden.
115 114 \begin{lstlisting}
116 115 gdrhs -> gd = exp [gdrhs]
117 116 rhs -> exp [where decls]
118 117 | gdrhs [where decls]
119 118 \end{lstlisting}
120   -Dess respektive parsers:
  119 +Desss motsvarande parsers.
121 120 \begin{lstlisting}
122 121 var gdrhs = gdrhs_action(
123 122 repeat1(gdrhs_fix_list_action(sequence(ws(gd),
@@ -144,7 +143,8 @@ \subsubsection{Steg 3 - Skapa AST}
144 143 \subsubsection{JSParse}
145 144 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.
146 145 \emph{Choice}-parsern cachade resultat från parsers som misslyckades och det cachade resultatet användes i senare parsers,
147   -vi löste det med en stackbaserad cache där cachen för en parser som misslyckas raderas.
  146 +vi löste det med en stackbaserad cache där cachen för en parser som misslyckas raderas.
  147 +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.
148 148
149 149 Parsers som vi har lagt till:
150 150 \begin{enumerate}

0 comments on commit b831891

Please sign in to comment.
Something went wrong with that request. Please try again.