tools/PascalParser.hs
changeset 6316 ac23ba018ed2
parent 6315 1f7a7a330c59
child 6317 83b93a2d2741
equal deleted inserted replaced
6315:1f7a7a330c59 6316:ac23ba018ed2
    64     | HexNumber String
    64     | HexNumber String
    65     | Reference Reference
    65     | Reference Reference
    66     | Null
    66     | Null
    67     deriving Show
    67     deriving Show
    68 data Reference = ArrayElement Identifier Expression
    68 data Reference = ArrayElement Identifier Expression
    69     | FunCall Reference [Expression]
    69     | FunCall [Expression] Reference
    70     | SimpleReference Identifier
    70     | SimpleReference Identifier
    71     | Dereference Reference
    71     | Dereference Reference
    72     | RecordField Reference Reference
    72     | RecordField Reference Reference
    73     | Address Reference
    73     | Address Reference
    74     deriving Show
    74     deriving Show
   146 reference = buildExpressionParser table term <?> "reference"
   146 reference = buildExpressionParser table term <?> "reference"
   147     where
   147     where
   148     term = comments >> choice [
   148     term = comments >> choice [
   149         parens pas reference 
   149         parens pas reference 
   150         , try $ iD >>= \i -> (brackets pas) expression >>= return . ArrayElement i
   150         , try $ iD >>= \i -> (brackets pas) expression >>= return . ArrayElement i
   151         , try $ funCall
       
   152         , try $ reference >>= \r -> char '^' >> return (Dereference r)
       
   153         , char '@' >> reference >>= return . Address
   151         , char '@' >> reference >>= return . Address
   154         , iD >>= return . SimpleReference
   152         , iD >>= return . SimpleReference
   155         ] <?> "simple reference"
   153         ] <?> "simple reference"
   156 
   154 
   157     table = [ 
   155     table = [ 
   158           [Infix (try (char '.' >> notFollowedBy (char '.')) >> return RecordField) AssocLeft]
   156             [Postfix $ (parens pas) (option [] parameters) >>= return . FunCall]
       
   157           , [Postfix (char '^' >> return Dereference)]
       
   158           , [Infix (try (char '.' >> notFollowedBy (char '.')) >> return RecordField) AssocLeft]
   159         ]
   159         ]
       
   160 
   160     
   161     
   161 varsDecl1 = varsParser sepEndBy1    
   162 varsDecl1 = varsParser sepEndBy1    
   162 varsDecl = varsParser sepEndBy
   163 varsDecl = varsParser sepEndBy
   163 varsParser m endsWithSemi = do
   164 varsParser m endsWithSemi = do
   164     vs <- m (aVarDecl endsWithSemi) (semi pas)
   165     vs <- m (aVarDecl endsWithSemi) (semi pas)
   523 procCall = do
   524 procCall = do
   524     i <- iD
   525     i <- iD
   525     p <- option [] $ (parens pas) parameters
   526     p <- option [] $ (parens pas) parameters
   526     return $ ProcCall i p
   527     return $ ProcCall i p
   527 
   528 
   528 funCall = do
       
   529     r <- reference
       
   530     p <- (parens pas) $ option [] parameters
       
   531     return $ FunCall r p
       
   532 
       
   533 parameters = (commaSep pas) expression <?> "parameters"
   529 parameters = (commaSep pas) expression <?> "parameters"
   534         
   530         
   535 functionBody = do
   531 functionBody = do
   536     p <- phrasesBlock
   532     p <- phrasesBlock
   537     char ';'
   533     char ';'