1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
{-
frown --code=stackless --optimize Ross.lg
Try
expr (lexer "f(g(a))(h(b)(c))")
-}
> module Ross
> where
> import Char
>
> data Expr = Ident String
> | Apply Expr Expr
> deriving (Show)
>
> data Terminal = IDENT String | LPAR | RPAR
>
> type Result = []
>
> %{
>
> Terminal = IDENT {String}
> | LPAR as "("
> | RPAR as ")";
>
> Nonterminal = expr {Expr};
>
> expr {Ident x} : IDENT {x};
> {Apply t u} | expr {t}, "(", expr {u}, ")";
>
> }%
>
> frown ts = fail "syntax error"
>
> lexer :: String -> [Terminal]
> lexer [] = []
> lexer ('(' : cs) = LPAR : lexer cs
> lexer (')' : cs) = RPAR : lexer cs
> lexer (c : cs)
> | isAlpha c = IDENT (c : s) : lexer cs'
> | otherwise = lexer cs
> where (s, cs') = span isAlphaNum cs
|