caa49c11071dd052d8fbbaf512a61d32f9106559
[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
6 -- | A complete grammar file
7 type GrammarFile = [ GrammarRule ]
8
9 type Priority = Int
10 type Weight = Int
11
12 type UserTag = String
13
14 defaultPriority :: Priority
15 defaultPriority = 0
16
17 defaultWeight :: Weight
18 defaultWeight = 1
19
20 -- | A single Rule. For now, only single branches
21 --   can be matched, not whole subtree structures
22 data GrammarRule = GrammarRule
23         { grName :: String
24         , grPriority :: Priority
25         , grWeight :: Weight
26         , grCondition :: Condition
27         , grAction :: GrammarAction
28         }
29         deriving (Read,Show)
30
31 data Matchable
32         = MatchLight
33         | MatchTotalLight
34         | MatchLength
35         | MatchTotalLength
36         | MatchDirection
37         | MatchAngle
38         deriving (Read,Show)
39
40 data Cmp
41         = LE
42         | Less
43         | Equals
44         | Greater
45         | GE 
46         deriving (Read,Show)
47
48 data Condition
49         = Always Bool -- constant conditions
50         | Condition `And` Condition
51         | Condition `Or` Condition
52         | UserTagIs String
53         | NumCond Matchable Cmp Double
54         deriving (Read,Show)
55          
56 data GrammarAction
57         = SetLength LengthDescr (Maybe UserTag)
58         | AddBranch Double Angle Double (Maybe (UserTag, UserTag, UserTag))
59         deriving (Read,Show)
60
61 data LengthDescr = Absolute Double
62                  | Additional Double
63                  | AdditionalRelative Double -- ^ in Percent
64         deriving (Read,Show)