Advertisement
Guest User

Untitled

a guest
Dec 9th, 2012
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module Parse
  2. ( identifier
  3. ) where
  4.  
  5. import           Control.Monad
  6. import qualified Data.Map as Map
  7. import           Text.ParserCombinators.Parsec
  8. import           Data.Either
  9. import           Data.Maybe
  10.  
  11. data Token = TokIdentifier String
  12.            | TokAlignAs
  13.            | TokAlignOf
  14.            | TokAsm
  15.            | TokAuto
  16.            | TokBool
  17.            | TokBreak
  18.            | TokCase
  19.            | TokCatch
  20.            | TokChar
  21.            | TokChar16T
  22.            | TokChar32T
  23.            | TokClass
  24.            | TokCompl
  25.            | TokConst
  26.            | TokConstExpr
  27.            | TokConstCast
  28.            | TokContinue
  29.            | TokDeclType
  30.            | TokDefault
  31.            | TokDelete
  32.            | TokDo
  33.            | TokDouble
  34.            | TokDynamicCast
  35.            | TokElse
  36.            | TokEnum
  37.            | TokExplicit
  38.            | TokExport
  39.            | TokExtern
  40.            | TokFalse
  41.            | TokFinal
  42.            | TokFloat
  43.            | TokFor
  44.            | TokFriend
  45.            | TokGoTo
  46.            | TokIf
  47.            | TokInline
  48.            | TokInt
  49.            | TokLong
  50.            | TokMutable
  51.            | TokNamespace
  52.            | TokNew
  53.            | TokNoExcept
  54.            | TokNullPtr
  55.            | TokOperator
  56.            | TokOverride
  57.            | TokPrivate
  58.            | TokProtected
  59.            | TokPublic
  60.            | TokRegister
  61.            | TokReinterpretCast
  62.            | TokReturn
  63.            | TokShort
  64.            | TokSigned
  65.            | TokSizeOf
  66.            | TokStatic
  67.            | TokStaticAssert
  68.            | TokStaticCast
  69.            | TokStruct
  70.            | TokSwitch
  71.            | TokTemplate
  72.            | TokThis
  73.            | TokThreadLocal
  74.            | TokThrow
  75.            | TokTrue
  76.            | TokTry
  77.            | TokTypeDef
  78.            | TokTypeID
  79.            | TokTypeName
  80.            | TokUnion
  81.            | TokUnsigned
  82.            | TokUsing
  83.            | TokVirtual
  84.            | TokVoid
  85.            | TokVolatile
  86.            | TokWCharT
  87.            | TokWhile
  88.  
  89.            | TokAnd
  90.            | TokOr
  91.  
  92.            | TokXor
  93.            | TokBitAnd
  94.            | TokBitOr
  95.            | TokAndEq
  96.            | TokOrEq
  97.            | TokXorEq
  98.  
  99.            | TokAddEq
  100.            | TokSubtractEq
  101.            | TokMultiplyEq
  102.            | TokDivideEq
  103.            | TokModuloEq
  104.  
  105.            | TokPound
  106.            | TokPoundPound
  107.  
  108.            | TokLShiftEq
  109.            | TokRShiftEq
  110.  
  111.            | TokVariadic
  112.  
  113.            | TokDerefMemberPointer
  114.  
  115.            | TokLBracket
  116.            | TokRBracket
  117.            | TokLBrace
  118.            | TokRBrace
  119.            | TokLParen
  120.            | TokRParen
  121.  
  122.            | TokColonColon
  123.            | TokMemberPointer
  124.            | TokLShift
  125.            | TokRShift
  126.            | TokEqEq
  127.            | TokNot
  128.            | TokNotEq
  129.            | TokLTEq
  130.            | TokGTEq
  131.            | TokIncrement
  132.            | TokDecrement
  133.  
  134.            | TokSemicolon
  135.            | TokColon
  136.            | TokMember
  137.            | TokAdd
  138.            | TokSubtract
  139.            | TokMultiply
  140.            | TokDivide
  141.            | TokModulo
  142.            | TokCaret
  143.            | TokBitNegate
  144.            | TokEq
  145.            | TokLT
  146.            | TokComma
  147.  
  148.            | TokGT
  149.  
  150.            deriving (Eq, Ord, Show)
  151.  
  152. identifier :: Bool -> Bool -> Parser Token
  153. identifier expectOverride expectFinal = do
  154.     c <- letter <|> char '_'
  155.     cs <- many (letter <|> digit <|> char '_')
  156.     return $ case (c:cs) of
  157.         "alignas" -> TokAlignAs
  158.         "alignof" -> TokAlignOf
  159.         "and" -> TokAnd
  160.         "and_eq" -> TokAndEq
  161.         "asm" -> TokAsm
  162.         "auto" -> TokAuto
  163.         "bitand" -> TokBitAnd
  164.         "bitor" -> TokBitOr
  165.         "bool" -> TokBool
  166.         "break" -> TokBreak
  167.         "case" -> TokCase
  168.         "catch" -> TokCatch
  169.         "char" -> TokChar
  170.         "char16_t" -> TokChar16T
  171.         "class" -> TokClass
  172.         "compl" -> TokCompl
  173.         "const" -> TokConst
  174.         "constexpr" -> TokConstExpr
  175.         "const_cast" -> TokConstCast
  176.         "continue" -> TokContinue
  177.         "decltype" -> TokDeclType
  178.         "default" -> TokDefault
  179.         "delete" -> TokDelete
  180.         "do" -> TokDo
  181.         "double" -> TokDouble
  182.         "dynamic_cast" -> TokDynamicCast
  183.         "else" -> TokElse
  184.         "enum" -> TokEnum
  185.         "explicit" -> TokExplicit
  186.         "export" -> TokExport
  187.         "false" -> TokFalse
  188.         "final" -> if expectFinal then TokFinal else TokIdentifier "final"
  189.         "float" -> TokFloat
  190.         "for" -> TokFor
  191.         "friend" -> TokFriend
  192.         "goto" -> TokGoTo
  193.         "if" -> TokIf
  194.         "inline" -> TokInline
  195.         "int" -> TokInt
  196.         "long" -> TokLong
  197.         "mutable" -> TokMutable
  198.         "namespace" -> TokNamespace
  199.         "new" -> TokNew
  200.         "noexcept" -> TokNoExcept
  201.         "not" -> TokNot
  202.         "not_eq" -> TokNotEq
  203.         "nullptr" -> TokNullPtr
  204.         "operator" -> TokOperator
  205.         "override" -> if expectOverride then TokOverride else TokIdentifier "override"
  206.         "private" -> TokPrivate
  207.         "protected" -> TokProtected
  208.         "public" -> TokPublic
  209.         "register" -> TokRegister
  210.         "reinterpret_cast" -> TokReinterpretCast
  211.         "return" -> TokReturn
  212.         "short" -> TokShort
  213.         "signed" -> TokSigned
  214.         "sizeof" -> TokSizeOf
  215.         "static" -> TokStatic
  216.         "static_assert" -> TokStaticAssert
  217.         "static_cast" -> TokStaticCast
  218.         "struct" -> TokStruct
  219.         "switch" -> TokSwitch
  220.         "template" -> TokTemplate
  221.         "this" -> TokThis
  222.         "thread_local" -> TokThreadLocal
  223.         "throw" -> TokThrow
  224.         "true" -> TokTrue
  225.         "try" -> TokTry
  226.         "typedef" -> TokTypeDef
  227.         "typeid" -> TokTypeID
  228.         "typename" -> TokTypeName
  229.         "union" -> TokUnion
  230.         "unsigned" -> TokUnsigned
  231.         "using" -> TokUsing
  232.         "virtual" -> TokVirtual
  233.         "void" -> TokVoid
  234.         "volatile" -> TokVolatile
  235.         "wchar_t" -> TokWCharT
  236.         "while" -> TokWhile
  237.         "xor" -> TokXor
  238.         "xor_eq" -> TokXorEq
  239.         s -> TokIdentifier s
  240.     <?> "identifier"
  241.  
  242. punctuation :: Bool -> Parser Token
  243. punctuation expectDoubleGT =
  244.     try (string "%:%:" >> return TokPoundPound) <|>
  245.     try (string "..." >> return TokVariadic) <|>
  246.     try (string "<<=" >> return TokLShiftEq) <|>
  247.     try (string ">>=" >> return TokRShiftEq) <|>
  248.     try (string "->*" >> return TokDerefMemberPointer) <|>
  249.     try (string "##" >> return TokPoundPound) <|>
  250.     try (string "<:" >> return TokLBracket) <|>
  251.     try (string ":>" >> return TokRBracket) <|>
  252.     try (string "<%" >> return TokLBrace) <|>
  253.     try (string "%>" >> return TokRBrace) <|>
  254.     try (string "%:" >> return TokPound) <|>
  255.     try (string "::" >> return TokColonColon) <|>
  256.     try (string ".*" >> return TokMemberPointer) <|>
  257.     try (string "+=" >> return TokAddEq) <|>
  258.     try (string "-=" >> return TokSubtractEq) <|>
  259.     try (string "*=" >> return TokMultiplyEq) <|>
  260.     try (string "/=" >> return TokDivideEq) <|>
  261.     try (string "%=" >> return TokModuloEq) <|>
  262.     try (string "^=" >> return TokXorEq) <|>
  263.     try (string "&=" >> return TokAndEq) <|>
  264.     try (string "|=" >> return TokOrEq) <|>
  265.     try (string "<<" >> return TokLShift) <|>
  266.     try (string "==" >> return TokEqEq) <|>
  267.     try (string "!=" >> return TokNotEq) <|>
  268.     try (string "<=" >> return TokLTEq) <|>
  269.     try (string ">=" >> return TokGTEq) <|>
  270.     try (string "&&" >> return TokAnd) <|>
  271.     try (string "||" >> return TokOr) <|>
  272.     try (string "++" >> return TokIncrement) <|>
  273.     try (string "--" >> return TokDecrement) <|>
  274.  
  275.     (char '{' >> return TokLBrace) <|>
  276.     (char '}' >> return TokRBrace) <|>
  277.     (char '[' >> return TokLBracket) <|>
  278.     (char ']' >> return TokRBracket) <|>
  279.     (char '#' >> return TokPound) <|>
  280.     (char '(' >> return TokLParen) <|>
  281.     (char ')' >> return TokRParen) <|>
  282.     (char ';' >> return TokSemicolon) <|>
  283.     (char ':' >> return TokColon) <|>
  284.     (char '.' >> return TokMember) <|>
  285.     (char '+' >> return TokAdd) <|>
  286.     (char '-' >> return TokSubtract) <|>
  287.     (char '*' >> return TokMultiply) <|>
  288.     (char '/' >> return TokDivide) <|>
  289.     (char '%' >> return TokModulo) <|>
  290.     (char '^' >> return TokCaret) <|>
  291.     (char '&' >> return TokBitAnd) <|>
  292.     (char '|' >> return TokBitOr) <|>
  293.     (char '~' >> return TokBitNegate) <|>
  294.     (char '!' >> return TokNot) <|>
  295.     (char '=' >> return TokEq) <|>
  296.     (char '<' >> return TokLT) <|>
  297.     (char '>' >> if expectDoubleGT then return TokGT else ((char '>' >> return TokRShift) <|> return TokGT)) <|>
  298.     (char ',' >> return TokComma)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement