~ubuntu-branches/ubuntu/warty/bnfc/warty

« back to all changes in this revision

Viewing changes to LexBNF.x

  • Committer: Bazaar Package Importer
  • Author(s): Antti-Juhani Kaijanaho
  • Date: 2004-05-02 22:56:44 UTC
  • Revision ID: james.westby@ubuntu.com-20040502225644-xs7k4eyj02c0f6rh
Tags: upstream-2.1.2
ImportĀ upstreamĀ versionĀ 2.1.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
-- This Alex file was machine-generated by the BNF converter
 
2
%{
 
3
module LexBNF where
 
4
 
 
5
import Alex
 
6
import ErrM
 
7
%}
 
8
 
 
9
{ ^l = [a-zA-Z^192-^255] # [^215 ^247]}    -- isolatin1 letter
 
10
{ ^c = [A-Z^192-^221] # [^215]}    -- capital isolatin1 letter
 
11
{ ^s = [a-z^222-^255] # [^247]}    -- small isolatin1 letter
 
12
{ ^d = [0-9]            }    -- digit
 
13
{ ^i = [^l^d^'^_]       }    -- identifier character
 
14
{ ^u = [^0-^255]        }    -- universal: any character
 
15
 
 
16
{ %s =    -- reserved words consisting of special symbols
 
17
   ^; | ^. | ^: ^: ^= | ^[ | ^] | ^_ | ^( | ^: | ^) | ^, | ^| | ^- | ^* | ^+ | ^? | ^{ | ^}
 
18
}
 
19
 
 
20
"tokens_lx"/"tokens_acts":-
 
21
<>         ::= ^-^- [.]* ^n
 
22
<>         ::= ^{ ^- ([^u # ^-] | ^- [^u # ^}])* (^-)+ ^}
 
23
 
 
24
<>         ::= ^w+
 
25
<pTSpec>   ::=  %s %{ pTSpec p = PT p . TS    %}
 
26
 
 
27
<ident>   ::= ^l ^i*   %{ ident  p = PT p . eitherResIdent TV %}
 
28
<string>  ::= ^" ([^u # [^"^\^n]] | (^\ (^" | ^\ | ^' | n | t)))* ^"%{ string p = PT p . TL . unescapeInitTail %}
 
29
<char>    ::= ^' (^u # [^'^\] | ^\ [^\ ^' n t]) ^'  %{ char   p = PT p . TC    %}
 
30
<int>    ::= ^d+      %{ int    p = PT p . TI    %}
 
31
 
 
32
 
 
33
%{ 
 
34
 
 
35
data Tok =
 
36
   TS String     -- reserved words
 
37
 | TL String     -- string literals
 
38
 | TI String     -- integer literals
 
39
 | TV String     -- identifiers
 
40
 | TD String     -- double precision float literals
 
41
 | TC String     -- character literals
 
42
 
 
43
 deriving (Eq,Show)
 
44
 
 
45
data Token = 
 
46
   PT  Posn Tok
 
47
 | Err Posn
 
48
  deriving Show
 
49
 
 
50
tokenPos (PT (Pn _ l _) _ :_) = "line " ++ show l
 
51
tokenPos (Err (Pn _ l _) :_) = "line " ++ show l
 
52
tokenPos _ = "end of file"
 
53
 
 
54
prToken t = case t of
 
55
  PT _ (TS s) -> s
 
56
  PT _ (TI s) -> s
 
57
  PT _ (TV s) -> s
 
58
  PT _ (TD s) -> s
 
59
  PT _ (TC s) -> s
 
60
  _ -> show t
 
61
 
 
62
tokens:: String -> [Token]
 
63
tokens inp = scan tokens_scan inp
 
64
 
 
65
tokens_scan:: Scan Token
 
66
tokens_scan = load_scan (tokens_acts,stop_act) tokens_lx
 
67
        where
 
68
        stop_act p ""  = []
 
69
        stop_act p inp = [Err p]
 
70
 
 
71
eitherResIdent :: (String -> Tok) -> String -> Tok
 
72
eitherResIdent tv s = if isResWord s then (TS s) else (tv s) where
 
73
  isResWord s = isInTree s $
 
74
    B "lower" (B "entrypoints" (B "comment" (B "coercions" (B "char" N N) N) (B "digit" N N)) (B "layout" (B "internal" (B "eps" N N) N) (B "letter" N N))) (B "terminator" (B "separator" (B "rules" (B "nonempty" N N) N) (B "stop" N N)) (B "toplevel" (B "token" N N) (B "upper" N N)))
 
75
 
 
76
data BTree = N | B String BTree BTree deriving (Show)
 
77
 
 
78
isInTree :: String -> BTree -> Bool
 
79
isInTree x tree = case tree of
 
80
  N -> False
 
81
  B a left right
 
82
   | x < a  -> isInTree x left
 
83
   | x > a  -> isInTree x right
 
84
   | x == a -> True
 
85
 
 
86
unescapeInitTail :: String -> String
 
87
unescapeInitTail = unesc . tail where
 
88
  unesc s = case s of
 
89
    '\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs
 
90
    '\\':'n':cs  -> '\n' : unesc cs
 
91
    '\\':'t':cs  -> '\t' : unesc cs
 
92
    '"':[]    -> []
 
93
    c:cs      -> c : unesc cs
 
94
    _         -> []
 
95
%}