File: Overlapping.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 (44 lines) | stat: -rw-r--r-- 1,212 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
{-

This grammar illustrates overlapping patterns (terminals). Note that
the patterns are ordered by generality (most general one last).

	frown Overlapping

-}

module Overlapping
where
import Char

data Expr                     =  Var String
                              |  If Expr Expr Expr
	                         deriving (Show)

type Result                   =  Maybe

frown ts                      =  fail "syntax error"

%{

Terminal                      =  "if"   =  Ident "if"
                              |  "then" =  Ident "then"
                              |  "else" =  Ident "else"
                              |            Ident {String};

Nonterminal                   =  expr {Expr};

expr {Var s}                  :  Ident {s};
     {If e1 e2 e3}            |  "if", expr {e1}, "then", expr {e2}, "else", expr {e3};

}%

data Terminal                 =  Ident String
	                         deriving (Show)

lexer                         :: String -> [Terminal]
lexer []                      =  []
lexer (c : cs)
    | isAlpha c               =  let (n, cs') = span isAlphaNum cs
                                 in  Ident (c : n) : lexer cs'
    | otherwise               =  lexer cs