File: Trace.g

package info (click to toggle)
frown 0.6.1-14
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 9,956 kB
  • ctags: 271
  • sloc: haskell: 35,132; makefile: 228; csh: 35; yacc: 23
file content (45 lines) | stat: -rw-r--r-- 965 bytes parent folder | download | duplicates (6)
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
{-

DIY tracing. Example taken from the Duponcheel/Swierstra paper.

	frown Example.g

Try

	fmap (\ s -> s "") (s "abba" :: IO ShowS) >>= putStrLn

-}

module Example
where

type Terminal                 =  Char

type Result                   =  IO

%{

Terminal                      =  'a' | 'b';
Nonterminal                   =  s {ShowS} | x {ShowS} | y {ShowS};

s {shift 'a' . y . x . reduce "aYX" 'S'}
  :  'a', y {y}, x {x};
x {shift 'b' . shift 'a' . reduce "ba" 'X'}
  :  'b', 'a';
x {a . reduce "Y" 'X'}
  :  y {a};
x {a . reduce "S" 'X'}
  :  s {a};
y {shift 'b' . reduce "b" 'Y'}
  :  'b';
y {shift 'a' . shift 'b' . reduce "ab" 'Y'}
  :  'a', 'b';

}%

frown ts                      =  fail "syntax error"

nl                            =  showChar '\n'
sp                            =  showChar ' '
shift s                       =  showString "shift " . shows s . nl
reduce ss s                   =  showString "reduce " . shows ss . sp . shows s .nl