{-|

Module      : Language.CSharp.Parser

Description : Parsing of C#



This module containg the parsing of C# resulting in the abstract syntax tree

defined in "Language.CSharp.Syntax". This module exports all other specific parsing

modules.

-}



module Language.CSharp.Parser(

      parser

    , pCompilationUnit

    , pUsing

    , module Language.CSharp.Parser.Utility

    , module Language.CSharp.Parser.Declaration

    , module Language.CSharp.Parser.Statement

    , module Language.CSharp.Parser.Expression

    , module Language.CSharp.Parser.Type

    , module Language.CSharp.Parser.Attribute

) where



import Text.Parsec                       hiding (Empty)

import Language.CSharp.Lexer

import Language.CSharp.Syntax

import Language.CSharp.Parser.Utility

import Language.CSharp.Parser.Declaration

import Language.CSharp.Parser.Statement

import Language.CSharp.Parser.Expression

import Language.CSharp.Parser.Type

import Language.CSharp.Parser.Attribute



-- | Parses the given list of tokens and returns either a parsing error or

-- the abstract syntax tree.

parser :: String -- ^ The original source file name.

       -> [Positioned Token]  -- ^ The list of tokens resulting from the lexer.

       -> Either ParseError CompilationUnit

parser = parse pCompilationUnit



--------------------------------------------------------------------------------

-- Compilation Unit and using.

--------------------------------------------------------------------------------



pCompilationUnit :: P CompilationUnit

pCompilationUnit = CompilationUnit <$> many pUsing <*> many pDeclaration <* eof



pUsing :: P Using

pUsing = do

    pToken TKWusing

    isStatic <- option False (True <$ pToken TKWstatic)

    name <- pName

    pSemi

    return $ Using name isStatic