Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch : master
http://hackage.haskell.org/trac/ghc/changeset/dc2f65f6e7c1763d848557708a980df35b755954 >--------------------------------------------------------------- commit dc2f65f6e7c1763d848557708a980df35b755954 Author: Paolo Capriotti <[email protected]> Date: Mon Apr 2 13:09:10 2012 +0100 Support qualified identifiers in quasi-quotes (#5555). >--------------------------------------------------------------- compiler/parser/Lexer.x | 25 ++++++++++++++++++++++++- compiler/parser/Parser.y.pp | 5 +++++ 2 files changed, 29 insertions(+), 1 deletions(-) diff --git a/compiler/parser/Lexer.x b/compiler/parser/Lexer.x index 94b2019..378a25c 100644 --- a/compiler/parser/Lexer.x +++ b/compiler/parser/Lexer.x @@ -321,6 +321,10 @@ $tab+ { warn Opt_WarnTabs (text "Tab character") } "[" @varid "|" / { ifExtension qqEnabled } { lex_quasiquote_tok } + + -- qualified quasi-quote (#5555) + "[" @qual @varid "|" / { ifExtension qqEnabled } + { lex_qquasiquote_tok } } <0> { @@ -562,7 +566,14 @@ data Token | ITidEscape FastString -- $x | ITparenEscape -- $( | ITtyQuote -- '' - | ITquasiQuote (FastString,FastString,RealSrcSpan) -- [:...|...|] + | ITquasiQuote (FastString,FastString,RealSrcSpan) + -- ITquasiQuote(quoter, quote, loc) + -- represents a quasi-quote of the form + -- [quoter| quote |] + | ITqQuasiQuote (FastString,FastString,FastString,RealSrcSpan) + -- ITqQuasiQuote(Qual, quoter, quote, loc) + -- represents a qualified quasi-quote of the form + -- [Qual.quoter| quote |] -- Arrow notation extension | ITproc @@ -1423,6 +1434,18 @@ getCharOrFail i = do -- ----------------------------------------------------------------------------- -- QuasiQuote +lex_qquasiquote_tok :: Action +lex_qquasiquote_tok span buf len = do + let (qual, quoter) = splitQualName (stepOn buf) (len - 2) False + quoteStart <- getSrcLoc + quote <- lex_quasiquote quoteStart "" + end <- getSrcLoc + return (L (mkRealSrcSpan (realSrcSpanStart span) end) + (ITqQuasiQuote (qual, + quoter, + mkFastString (reverse quote), + mkRealSrcSpan quoteStart end))) + lex_quasiquote_tok :: Action lex_quasiquote_tok span buf len = do let quoter = tail (lexemeToString buf (len - 1)) diff --git a/compiler/parser/Parser.y.pp b/compiler/parser/Parser.y.pp index 6424dea..9774c24 100644 --- a/compiler/parser/Parser.y.pp +++ b/compiler/parser/Parser.y.pp @@ -350,6 +350,7 @@ TH_ID_SPLICE { L _ (ITidEscape _) } -- $x '$(' { L _ ITparenEscape } -- $( exp ) TH_TY_QUOTE { L _ ITtyQuote } -- ''T TH_QUASIQUOTE { L _ (ITquasiQuote _) } +TH_QQUASIQUOTE { L _ (ITqQuasiQuote _) } %monad { P } { >>= } { return } %lexer { lexer } { L _ ITeof } @@ -1360,6 +1361,10 @@ quasiquote :: { Located (HsQuasiQuote RdrName) } ; ITquasiQuote (quoter, quote, quoteSpan) = unLoc $1 ; quoterId = mkUnqual varName quoter } in L1 (mkHsQuasiQuote quoterId (RealSrcSpan quoteSpan) quote) } + | TH_QQUASIQUOTE { let { loc = getLoc $1 + ; ITqQuasiQuote (qual, quoter, quote, quoteSpan) = unLoc $1 + ; quoterId = mkQual varName (qual, quoter) } + in sL (getLoc $1) (mkHsQuasiQuote quoterId (RealSrcSpan quoteSpan) quote) } exp :: { LHsExpr RdrName } : infixexp '::' sigtype { LL $ ExprWithTySig $1 $3 } _______________________________________________ Cvs-ghc mailing list [email protected] http://www.haskell.org/mailman/listinfo/cvs-ghc
