Some non-syntactical checking of rules
authorJoachim Breitner <mail@joachim-breitner.de>
Thu, 7 May 2009 22:27:56 +0000 (00:27 +0200)
committerJoachim Breitner <mail@joachim-breitner.de>
Thu, 7 May 2009 22:27:56 +0000 (00:27 +0200)
src/Lseed/Grammar.hs
src/Lseed/Grammar/Compile.hs
src/Lseed/Grammar/Parse.hs

index 67808b2..69d199c 100644 (file)
@@ -2,6 +2,7 @@
 module Lseed.Grammar where
 
 import Lseed.Data
+import Data.List
 
 -- | A complete grammar file
 type GrammarFile = [ GrammarRule ]
@@ -62,3 +63,18 @@ data LengthDescr = Absolute Double
                 | Additional Double
                  | AdditionalRelative Double -- ^ in Percent
        deriving (Read,Show)
+
+actionsAreInvalid :: [GrammarAction] -> Maybe String
+actionsAreInvalid [_] = Nothing
+actionsAreInvalid acts
+       = if all isAddBranch acts 
+          then case nub (map addBranchAngle acts) of
+           [frac] -> Nothing
+           _      -> Just "Can not branch at different points at the same time."
+         else        Just "Can not grow and branch at the same time."
+
+isAddBranch (AddBranch _ _ _ _) = True
+isAddBranch _ = False
+
+addBranchAngle (AddBranch angle _ _ _) = angle
+
index 1599d79..5666ecc 100644 (file)
@@ -43,11 +43,6 @@ grToLAction acts  (Stipe () l _)
        | otherwise
        = error "Can not grow and branch at the same time"
 
-isAddBranch (AddBranch _ _ _ _) = True
-isAddBranch _ = False
-
-addBranchAngle (AddBranch angle _ _ _) = angle
-
 -- | Length reductions are silenty turned into no-ops
 calcLengthDescr :: LengthDescr -> Double -> Double
 calcLengthDescr (Absolute val) l  = max l val
index 08846f9..4075c54 100644 (file)
@@ -4,6 +4,7 @@ import Text.Parsec
 import qualified Text.Parsec.Token as P
 import Text.Parsec.Language (javaStyle)
 import Text.Parsec.Expr
+import Control.Monad
 
 import Lseed.Grammar
 
@@ -46,6 +47,7 @@ pRule = do
                reserved "WHEN"
                pCondition
        actions <- many1 pAction
+       maybe (return ()) fail (actionsAreInvalid actions)
        priority <- option 1 $ do
                reserved "IMPORTANCE"
                fromIntegral `fmap` natural