Token.hs revision 82c8392d65c447d27a2332579f6c3fe1c35818a3
020cdb5dad6b871aba61136a0e1567c00426de87Andy Gimblett
8267b99c0d7a187abe6f87ad50530dc08f5d1cdcAndy Gimblett{- |
e071fb22ea9923a2a4ff41184d80ca46b55ee932Till MossakowskiModule : $Header$
020cdb5dad6b871aba61136a0e1567c00426de87Andy GimblettCopyright : (c) Christian Maeder and Uni Bremen 2002-2004
020cdb5dad6b871aba61136a0e1567c00426de87Andy GimblettLicence : similar to LGPL, see HetCATS/LICENCE.txt or LIZENZ.txt
020cdb5dad6b871aba61136a0e1567c00426de87Andy Gimblett
020cdb5dad6b871aba61136a0e1567c00426de87Andy GimblettMaintainer : hets@tzi.de
020cdb5dad6b871aba61136a0e1567c00426de87Andy GimblettStability : provisional
020cdb5dad6b871aba61136a0e1567c00426de87Andy GimblettPortability : portable
020cdb5dad6b871aba61136a0e1567c00426de87Andy Gimblett
020cdb5dad6b871aba61136a0e1567c00426de87Andy Gimblett parser for CASL 'Id's based on "Common.Lexer"
020cdb5dad6b871aba61136a0e1567c00426de87Andy Gimblett
020cdb5dad6b871aba61136a0e1567c00426de87Andy Gimblett-}
9ebbce450fb242e1a346f9f89367d8c46fcb2ec8Andy Gimblett{- http://www.cofi.info/Documents/CASL/Summary/
020cdb5dad6b871aba61136a0e1567c00426de87Andy Gimblett from 25 March 2001
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly
1aef7e013543ce13074e14d093b1613e67cabc6aAndy Gimblett C.2.1 Basic Specifications with Subsorts
aa0d5f8be9950e788884f7431cf4cb7bee74788cAndy Gimblett
020cdb5dad6b871aba61136a0e1567c00426de87Andy GimblettSIMPLE-ID ::= WORDS
020cdb5dad6b871aba61136a0e1567c00426de87Andy GimblettID ::= TOKEN-ID | MIXFIX-ID
05b3e12808da901dccd665715cb934462290d550Andy GimblettTOKEN-ID ::= TOKEN
020cdb5dad6b871aba61136a0e1567c00426de87Andy GimblettMIXFIX-ID ::= TOKEN-ID PLACE-TOKEN-ID ... PLACE-TOKEN-ID
9ebbce450fb242e1a346f9f89367d8c46fcb2ec8Andy Gimblett | PLACE-TOKEN-ID ... PLACE-TOKEN-ID
aa0d5f8be9950e788884f7431cf4cb7bee74788cAndy GimblettPLACE-TOKEN-ID ::= PLACE TOKEN-ID
aa0d5f8be9950e788884f7431cf4cb7bee74788cAndy Gimblett | PLACE
020cdb5dad6b871aba61136a0e1567c00426de87Andy GimblettPLACE ::= __
61051521e4d82769a47f23aecb5fb477de47d534Andy Gimblett
61051521e4d82769a47f23aecb5fb477de47d534Andy GimblettTOKEN ::= WORDS | DOT-WORDS | DIGIT | QUOTED-CHAR
567db7182e691cce5816365d8c912d09ffe92f86Andy Gimblett | SIGNS
61051521e4d82769a47f23aecb5fb477de47d534Andy Gimblett
61051521e4d82769a47f23aecb5fb477de47d534Andy Gimblett SIGNS are adapted here and more permissive as in the summary
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett WORDS and NO-BRACKET-SIGNS are treated equally
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett legal are, ie. "{a}", "{+}", "a{}="
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett illegal is "a=" (no two SIMPLE-TOKEN stay beside each other)
05b3e12808da901dccd665715cb934462290d550Andy Gimblett
05b3e12808da901dccd665715cb934462290d550Andy Gimblett SIMPLE-TOKEN ::= WORDS | DOT-WORDS | DIGIT | QUOTED-CHAR
05b3e12808da901dccd665715cb934462290d550Andy Gimblett | NO-BRACKET-SIGNS
c052e3ee4a53ee3a2da829aa142fd596ef6c9e3dAndy Gimblett
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett STB ::= SIMPLE-TOKEN BRACKETS
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett BST ::= BRACKETS SIMPLE-TOKEN
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett
53f89daf88665d3ea96d871110a5c0d9d8326bd2Andy Gimblett SIGNS ::= BRACKETS
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett | BRACKETS STB ... STB
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett | BRACKETS STB ... STB SIMPLE-TOKEN
53f89daf88665d3ea96d871110a5c0d9d8326bd2Andy Gimblett | SIMPLE-TOKEN
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett | SIMPLE-TOKEN BST ... BST
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett | SIMPLE-TOKEN BST ... BST BRACKETS
53f89daf88665d3ea96d871110a5c0d9d8326bd2Andy Gimblett
53f89daf88665d3ea96d871110a5c0d9d8326bd2Andy Gimblett A SIMPLE-TOKEN followed by "[" outside nested brackets
05b3e12808da901dccd665715cb934462290d550Andy Gimblett will be taken as the beginning of a compound list.
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett Within SIGNS brackets need not be balanced,
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett only after their composition to a MIXFIX-ID.
c052e3ee4a53ee3a2da829aa142fd596ef6c9e3dAndy Gimblett
c052e3ee4a53ee3a2da829aa142fd596ef6c9e3dAndy Gimblett BRACKETS = BRACKET ... BRACKET
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett BRACKET ::= [ | ] | { | }
c052e3ee4a53ee3a2da829aa142fd596ef6c9e3dAndy Gimblett
c052e3ee4a53ee3a2da829aa142fd596ef6c9e3dAndy Gimblett 2.4 Identifiers
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett brackets/braces within MIXFIX-ID must be balanced
c052e3ee4a53ee3a2da829aa142fd596ef6c9e3dAndy Gimblett
a09bfcbcb0fba5663fca1968aa82daebf2e092c4Andy Gimblett C.2.2 Structured Specifications
a181b88611e09ffc9701a5f1022002cc0bc0c584Andy Gimblett
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett TOKEN-ID ::= ... | TOKEN [ ID ,..., ID ]
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett
a09bfcbcb0fba5663fca1968aa82daebf2e092c4Andy Gimblett A compound list must follow the last TOKEN within MIXFIX-ID,
05b3e12808da901dccd665715cb934462290d550Andy Gimblett so a compound list is never nested within (balanced) mixfix BRACKETS.
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett Only PLACEs may follow a compound list.
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett The IDs within the compound list may surely be compound IDs again.
61051521e4d82769a47f23aecb5fb477de47d534Andy Gimblett-}
61051521e4d82769a47f23aecb5fb477de47d534Andy Gimblett
61051521e4d82769a47f23aecb5fb477de47d534Andy Gimblettmodule Common.Token where
61051521e4d82769a47f23aecb5fb477de47d534Andy Gimblett
61051521e4d82769a47f23aecb5fb477de47d534Andy Gimblettimport Common.Keywords
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblettimport Common.Lexer
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblettimport Common.Id (Id(Id), Token(..), Pos, toPos, isPlace)
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblettimport Common.Lib.Parsec
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblett
b22c258cca179a5ffe777b64b32e10687c5f6b2cAndy Gimblett-- ----------------------------------------------
b22c258cca179a5ffe777b64b32e10687c5f6b2cAndy Gimblett-- * Casl keyword lists
b22c258cca179a5ffe777b64b32e10687c5f6b2cAndy Gimblett-- ----------------------------------------------
b22c258cca179a5ffe777b64b32e10687c5f6b2cAndy Gimblett
8528886a04f14abe0ddf80f50c853cc25bc821cdAndy Gimblett-- | reserved signs
876bd2c70a93981cc80f8376284616bce4a0fefcChristian Maedercasl_reserved_ops :: [String]
1c7c4d95775a8ad5f7373e5cf0bad86f8301c56cAndy Gimblettcasl_reserved_ops = [colonS, colonS++quMark, defnS, dotS, cDot, mapsTo]
aa0d5f8be9950e788884f7431cf4cb7bee74788cAndy Gimblett
aa0d5f8be9950e788884f7431cf4cb7bee74788cAndy Gimblett-- | these formula signs are legal in terms, but illegal in declarations
aa0d5f8be9950e788884f7431cf4cb7bee74788cAndy Gimblettformula_ops :: [String]
aa0d5f8be9950e788884f7431cf4cb7bee74788cAndy Gimblettformula_ops = [equalS, implS, equivS, lOr, lAnd, negS]
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- | all reseverd signs
197888c54795ec1e79e77289b7e20436a6db74c0Andy Gimblettcasl_reserved_fops :: [String]
197888c54795ec1e79e77289b7e20436a6db74c0Andy Gimblettcasl_reserved_fops = formula_ops ++ casl_reserved_ops
197888c54795ec1e79e77289b7e20436a6db74c0Andy Gimblett
a1f6118e7ce7f8892fc4299e316630ec74083f0aAndy Gimblett-- | reserved keywords
a1f6118e7ce7f8892fc4299e316630ec74083f0aAndy Gimblettcasl_basic_reserved_words :: [String]
a1f6118e7ce7f8892fc4299e316630ec74083f0aAndy Gimblettcasl_basic_reserved_words =
a1f6118e7ce7f8892fc4299e316630ec74083f0aAndy Gimblett [asS, existsS, forallS, freeS, generatedS,
a1f6118e7ce7f8892fc4299e316630ec74083f0aAndy Gimblett inS, opS, opS ++ sS, predS, predS ++ sS,
a1f6118e7ce7f8892fc4299e316630ec74083f0aAndy Gimblett sortS, sortS ++ sS, typeS, typeS ++ sS]
a1f6118e7ce7f8892fc4299e316630ec74083f0aAndy Gimblett
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- | reserved keywords
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblettcasl_structured_reserved_words :: [String]
05b3e12808da901dccd665715cb934462290d550Andy Gimblettcasl_structured_reserved_words =
05b3e12808da901dccd665715cb934462290d550Andy Gimblett [andS, archS, axiomS, axiomS ++ sS, closedS, cofreeS, "cotype", "cotypes", endS,
05b3e12808da901dccd665715cb934462290d550Andy Gimblett fitS, freeS, fromS, getS, givenS,
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett hideS, lambdaS, libraryS, localS, logicS,
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett resultS, revealS, specS, thenS, toS,
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett unitS, unitS ++ sS, varS, varS ++ sS, versionS, viewS, withS, withinS]
20ed727452613e36c0a95ddabf7ecc81cf941ed2Andy Gimblett
c679188b6762edb198e353f724e77c74aa64a7e4Andy Gimblett-- | reserved keywords
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblettcasl_reserved_words :: [String]
fd4ad12563262ebe380d810df8f7755cfab5fb42Liam O'Reillycasl_reserved_words =
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett casl_basic_reserved_words++ casl_structured_reserved_words
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett
20ed727452613e36c0a95ddabf7ecc81cf941ed2Andy Gimblett-- | these formula words are legal in terms, but illegal in declarations
9f31535736c3d43a98f0157efaa7f87ea73c9be0Liam O'Reillyformula_words :: [String]
576a4ca6de740c90afd448607c2323477139de24Liam O'Reillyformula_words = [defS, elseS, ifS, whenS, falseS, notS, trueS]
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett-- | all reserved words
20ed727452613e36c0a95ddabf7ecc81cf941ed2Andy Gimblettcasl_reserved_fwords :: [String]
20ed727452613e36c0a95ddabf7ecc81cf941ed2Andy Gimblettcasl_reserved_fwords = formula_words ++ casl_reserved_words
20ed727452613e36c0a95ddabf7ecc81cf941ed2Andy Gimblett
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- ----------------------------------------------
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett-- * a single 'Token' parser
20ed727452613e36c0a95ddabf7ecc81cf941ed2Andy Gimblett-- pass list of key symbols and keywords as parameter
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett-- ----------------------------------------------
20ed727452613e36c0a95ddabf7ecc81cf941ed2Andy Gimblett
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett-- | a simple 'Token' parser depending on reserved signs and words
20ed727452613e36c0a95ddabf7ecc81cf941ed2Andy Gimblett-- (including a quoted char, dot-words or a single digit)
20ed727452613e36c0a95ddabf7ecc81cf941ed2Andy Gimblettsid :: ([String], [String]) -> GenParser Char st Token
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblettsid (kOps, kWords) = pToken (scanQuotedChar <|> scanDotWords
20ed727452613e36c0a95ddabf7ecc81cf941ed2Andy Gimblett <|> scanDigit <|> reserved kOps scanAnySigns
20ed727452613e36c0a95ddabf7ecc81cf941ed2Andy Gimblett <|> reserved kWords scanAnyWords <?> "simple-id")
20ed727452613e36c0a95ddabf7ecc81cf941ed2Andy Gimblett
edc768ab3a40d51bf18761330cfc4b4d460c0822Andy Gimblett-- * 'Token' lists parsers
0a83f8dcd5598436966584b858313eb5efd95d5bLiam O'Reilly
0a83f8dcd5598436966584b858313eb5efd95d5bLiam O'Reilly-- | balanced mixfix components within braces
0a83f8dcd5598436966584b858313eb5efd95d5bLiam O'ReillybraceP :: GenParser Char st [Token] -> GenParser Char st [Token]
0a83f8dcd5598436966584b858313eb5efd95d5bLiam O'ReillybraceP p = begDoEnd oBraceT p cBraceT <|> try (oBracketT <:> single cBracketT)
0a83f8dcd5598436966584b858313eb5efd95d5bLiam O'Reilly-- | balanced mixfix components within square brackets
0a83f8dcd5598436966584b858313eb5efd95d5bLiam O'ReillybracketP :: GenParser Char st [Token] -> GenParser Char st [Token]
0a83f8dcd5598436966584b858313eb5efd95d5bLiam O'ReillybracketP p = begDoEnd oBracketT p cBracketT
0a83f8dcd5598436966584b858313eb5efd95d5bLiam O'Reilly
2f35e5f6757968746dbab385be21fcae52378a3fLiam O'Reilly-- | an 'sid' optionally followed by other mixfix components
2f35e5f6757968746dbab385be21fcae52378a3fLiam O'Reilly-- (without no two consecutive 'sid's)
33bdce26495121cdbce30331ef90a1969126a840Liam O'ReillyinnerMix1 :: ([String], [String]) -> GenParser Char st [Token]
d9c1248c7972dfdafbacb1b73b2eb965eac9ef42Liam O'ReillyinnerMix1 l = sid l <:> option [] (innerMix2 l)
d9c1248c7972dfdafbacb1b73b2eb965eac9ef42Liam O'Reilly
d9c1248c7972dfdafbacb1b73b2eb965eac9ef42Liam O'Reilly-- | mixfix components not starting with a 'sid' (possibly places)
7371f8fe3a9a286a74ea30a3cd18e7740f67d537Andy GimblettinnerMix2 :: ([String], [String]) -> GenParser Char st [Token]
fd4ad12563262ebe380d810df8f7755cfab5fb42Liam O'ReillyinnerMix2 l = let p = innerList l in
fd4ad12563262ebe380d810df8f7755cfab5fb42Liam O'Reilly flat (many1 (braceP p <|> bracketP p <|> many1 placeT))
fd4ad12563262ebe380d810df8f7755cfab5fb42Liam O'Reilly <++> option [] (innerMix1 l)
fd4ad12563262ebe380d810df8f7755cfab5fb42Liam O'Reilly
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- | any mixfix components within braces or brackets
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy GimblettinnerList :: ([String], [String]) -> GenParser Char st [Token]
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy GimblettinnerList l = option [] (innerMix1 l <|> innerMix2 l <?> "token")
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- | mixfix components starting with a 'sid' (outside 'innerList')
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy GimbletttopMix1 :: ([String], [String]) -> GenParser Char st [Token]
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy GimbletttopMix1 l = sid l <:> option [] (topMix2 l)
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- | mixfix components starting with braces ('braceP')
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- that may follow 'sid' outside 'innerList'.
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- (Square brackets after a 'sid' will be taken as a compound list.)
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy GimbletttopMix2 :: ([String], [String]) -> GenParser Char st [Token]
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy GimbletttopMix2 l = flat (many1 (braceP $ innerList l)) <++> option [] (topMix1 l)
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- | mixfix components starting with square brackets ('bracketP')
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- that may follow a place ('placeT') (outside 'innerList')
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy GimbletttopMix3 :: ([String], [String]) -> GenParser Char st [Token]
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy GimbletttopMix3 l = let p = innerList l in
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett bracketP p <++> flat (many (braceP p))
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett <++> option [] (topMix1 l)
c679188b6762edb198e353f724e77c74aa64a7e4Andy Gimblett
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- | any ('topMix1', 'topMix2', 'topMix3') mixfix components
c679188b6762edb198e353f724e77c74aa64a7e4Andy Gimblett-- that may follow a place ('placeT') at the top level
06dd4e7c29f33f6122a910719e3bd9062256e397Andy GimblettafterPlace :: ([String], [String]) -> GenParser Char st [Token]
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy GimblettafterPlace l = topMix1 l <|> topMix2 l<|> topMix3 l
9f31535736c3d43a98f0157efaa7f87ea73c9be0Liam O'Reilly
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett-- | 'place's possibly followed by other ('afterPlace') mixfix components
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblettmiddle :: ([String], [String]) -> GenParser Char st [Token]
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblettmiddle l = many1 placeT <++> option [] (afterPlace l)
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett-- | many (balanced, top-level) mixfix components ('afterPlace')
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- possibly interspersed with multiple places ('placeT')
06dd4e7c29f33f6122a910719e3bd9062256e397Andy GimbletttokStart :: ([String], [String]) -> GenParser Char st [Token]
06dd4e7c29f33f6122a910719e3bd9062256e397Andy GimbletttokStart l = afterPlace l <++> flat (many (middle l))
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett-- | any (balanced, top-level) mixfix components
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett-- possibly starting with places but no single 'placeT' only.
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblettstart :: ([String], [String]) -> GenParser Char st [Token]
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblettstart l = tokStart l <|> placeT <:> (tokStart l <|>
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett many1 placeT <++> option [] (tokStart l))
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett <?> "id"
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett-- ----------------------------------------------
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett-- * parser for mixfix and compound 'Id's
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- ----------------------------------------------
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett-- | parsing a compound list
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblettcomps :: ([String], [String]) -> GenParser Char st ([Id], [Pos])
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblettcomps keys = do o <- oBracketT
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett (ts, ps) <- mixId keys keys `separatedBy` commaT
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett c <- cBracketT
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett return (ts, toPos o ps c)
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett <?> "[<id>,...,<id>]"
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- | parse mixfix components ('start') and an optional compound list ('comps')
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- if the last token was no 'place'. Accept possibly further places.
da955132262baab309a50fdffe228c9efe68251dCui Jian-- Key strings (second argument) within compound list may differ from
afc52bfaabee38c4d55cee9f35b1a0028ba3854aAndy Gimblett-- top-level key strings (frist argument)!
7371f8fe3a9a286a74ea30a3cd18e7740f67d537Andy GimblettmixId :: ([String], [String]) -> ([String], [String]) -> GenParser Char st Id
7371f8fe3a9a286a74ea30a3cd18e7740f67d537Andy GimblettmixId keys idKeys =
7371f8fe3a9a286a74ea30a3cd18e7740f67d537Andy Gimblett do l <- start keys
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly if isPlace (last l) then return (Id l [] [])
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly else do (c, p) <- option ([], []) (comps idKeys)
7371f8fe3a9a286a74ea30a3cd18e7740f67d537Andy Gimblett u <- many placeT
fd4ad12563262ebe380d810df8f7755cfab5fb42Liam O'Reilly return (Id (l++u) c p)
fd4ad12563262ebe380d810df8f7755cfab5fb42Liam O'Reilly
2bb060537a37352251aa04d8dc09aa53aad5d4bfLiam O'Reilly-- | the Casl key strings (signs first) with additional keywords
576a4ca6de740c90afd448607c2323477139de24Liam O'Reillycasl_keys :: [String] -> ([String], [String])
576a4ca6de740c90afd448607c2323477139de24Liam O'Reillycasl_keys ks = (ks ++ casl_reserved_fops, ks ++ casl_reserved_fwords)
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- | Casl ids for operations and predicates
2bb060537a37352251aa04d8dc09aa53aad5d4bfLiam O'ReillyparseId :: [String] -> GenParser Char st Id
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillyparseId ks = mixId (casl_keys ks) (casl_keys ks)
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- | disallow 'barS' with in the top-level of constructor names
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillyconsId :: [String] -> GenParser Char st Id
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillyconsId ks = mixId (barS:ks++casl_reserved_fops,
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly ks++casl_reserved_fwords) $ casl_keys ks
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- | Casl sorts are simple words ('varId'),
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- but may have a compound list ('comps')
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillysortId :: [String] -> GenParser Char st Id
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillysortId ks =
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly do s <- varId ks
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly (c, p) <- option ([], []) (comps $ casl_keys ks)
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly return (Id [s] c p)
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- ----------------------------------------------
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- * parser for simple 'Id's
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- ----------------------------------------------
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- | parse a simple word not in 'casl_reserved_fwords'
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillyvarId :: [String] -> GenParser Char st Token
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillyvarId ks = pToken (reserved (ks++casl_reserved_fwords) scanAnyWords)
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- | like 'varId'. 'SIMPLE_ID' for spec- and view names
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillysimpleId :: GenParser Char st Token
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillysimpleId = varId []
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- ----------------------------------------------
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- * parser for key 'Token's
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- ----------------------------------------------
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- | parse a question mark key sign ('quMark')
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillyquMarkT :: GenParser Char st Token
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillyquMarkT = pToken $ toKey quMark
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- | parse a colon ('colonS') even if other signs (like 'quMark')
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- immediately follow.
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillycolonST :: GenParser Char st Token
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillycolonST = pToken (string colonS)
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly-- | parse the product key sign ('prodS' or 'timesS')
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillycrossT :: GenParser Char st Token
576a4ca6de740c90afd448607c2323477139de24Liam O'ReillycrossT = try (pToken (toKey prodS <|> toKey timesS) <?> "cross")
576a4ca6de740c90afd448607c2323477139de24Liam O'Reilly