Allow "SET TAG" nach BLOSSOM
[L-seed.git] / src / Lseed / Grammar.hs
1 -- | Grammer-like representation for a plant genome
2 module Lseed.Grammar where
3
4 import Lseed.Data
5 import Data.List
6
7 -- | A complete grammar file
8 type GrammarFile = [ GrammarRule ]
9
10 type Priority = Int
11 type Weight = Int
12
13 defaultPriority :: Priority
14 defaultPriority = 0
15
16 defaultWeight :: Weight
17 defaultWeight = 1
18
19 -- | A single Rule. For now, only single branches
20 --   can be matched, not whole subtree structures
21 data GrammarRule = GrammarRule
22         { grName :: String
23         , grPriority :: Priority
24         , grWeight :: Weight
25         , grCondition :: Condition
26         , grAction :: GrammarAction
27         }
28         deriving (Read,Show)
29
30 data Matchable
31         = MatchLight
32         | MatchSubLight
33         | MatchLength
34         | MatchSubLength
35         | MatchDirection
36         | MatchAngle
37         deriving (Read,Show)
38
39 data Cmp
40         = LE
41         | Less
42         | Equals
43         | Greater
44         | GE 
45         deriving (Read,Show)
46
47 data Condition
48         = Always Bool -- constant conditions
49         | Condition `And` Condition
50         | Condition `Or` Condition
51         | UserTagIs String
52         | NumCond Matchable Cmp Double
53         deriving (Read,Show)
54          
55 data GrammarAction
56         = SetLength (Maybe UserTag) LengthDescr
57         | AddBranches (Maybe UserTag) Double [(Angle, Double, Maybe UserTag)]
58         | Blossom (Maybe UserTag)
59         deriving (Read,Show)
60
61 data LengthDescr = Absolute Double
62                  | Additional Double
63                  | AdditionalRelative Double -- ^ in Percent
64         deriving (Read,Show)
65