...
 
Commits (2)
......@@ -34,6 +34,7 @@ ENTRY
institution
journal
key
location
month
note
number
......@@ -425,6 +426,44 @@ FUNCTION { output.coden } % UTAH
if$
}
%
% Sometimes articleno starts with the word 'Article' or 'Paper.
% (this is a bug of acmdl, sigh)
% We strip them. We assume eid or articleno is already on stack
%
FUNCTION { strip.articleno.or.eid }
{
't :=
t #1 #7 substring$ "Article" =
{t #8 t text.length$ substring$ 't :=}
{ }
if$
t #1 #7 substring$ "article" =
{t #8 t text.length$ substring$ 't :=}
{ }
if$
t #1 #5 substring$ "Paper" =
{t #6 t text.length$ substring$ 't :=}
{ }
if$
t #1 #5 substring$ "paper" =
{t #6 t text.length$ substring$ 't :=}
{ }
if$
% Strip any left trailing space or ~
t #1 #1 substring$ " " =
{t #2 t text.length$ substring$ 't :=}
{ }
if$
t #1 #1 substring$ "~" =
{t #2 t text.length$ substring$ 't :=}
{ }
if$
t
}
FUNCTION { format.articleno }
{
articleno empty.or.unknown not eid empty.or.unknown not and
......@@ -440,20 +479,20 @@ FUNCTION { format.articleno }
{ }
if$
eid empty.or.unknown
{ "Article \bibinfo{articleno}{" articleno * "}" * }
{ "Article \bibinfo{articleno}{" eid * "}" * }
{ "Article \bibinfo{articleno}{" articleno strip.articleno.or.eid * "}" * }
{ "Article \bibinfo{articleno}{" eid strip.articleno.or.eid * "}" * }
if$
}
if$
}
FUNCTION { format.year }
{ % push year string or "[n. d.]" onto output stack
{ % push year string or "[n.\,d.]" onto output stack
%% Because year is a mandatory field, we always force SOMETHING
%% to be output
"\bibinfo{year}{"
year empty.or.unknown
{ "[n. d.]" }
{ "[n.\,d.]" }
{ year }
if$
* "}" *
......@@ -678,16 +717,15 @@ FUNCTION { output.eprint } %
}
{ "[" archiveprefix "l" change.case$ "]" * * * }
if$
"{" *
"{" eprint "}" * * *
primaryclass empty.or.unknown
{ eprintclass empty.or.unknown
{ }
{ eprintclass "/" * * }
{ "~[" eprintclass "]" * * * }
if$
}
{ primaryclass "/" * * }
{ "~[" primaryclass "]" * * * }
if$
eprint "}" * *
writeln
}
if$
......@@ -732,7 +770,7 @@ FUNCTION { output.year.check }
year empty.or.unknown
{ "empty year in " cite$ * warning$
write$
" \bibinfo{year}{[n. d.]}"
" \bibinfo{year}{[n.d.]}"
"\natexlab{" extra.label * "}" * *
mid.sentence 'output.state :=
}
......@@ -1232,6 +1270,8 @@ FUNCTION { format.btitle }
FUNCTION { format.emphasize.booktitle }
{ booktitle format.a.title.with.edition }
FUNCTION { format.city }
{
% jtb: if the preceding string (the title of the conference) is non-empty,
......@@ -1241,7 +1281,7 @@ FUNCTION { format.city }
duplicate$ empty.or.unknown
{ }
{
city empty.or.unknown
city empty.or.unknown location empty.or.unknown and
{
date empty.or.unknown
{ }
......@@ -1249,9 +1289,19 @@ FUNCTION { format.city }
if$
}
{
date empty.or.unknown
{ " (" * city * ")" * }
{ " (" * city * ", " * date * ")" * }
location empty.or.unknown
{
date empty.or.unknown
{ " (" * city * ")" * }
{ " (" * city * ", " * date * ")" * }
if$
}
{
date empty.or.unknown
{ " (" * location * ")" * }
{ " (" * location * ", " * date * ")" * }
if$
}
if$
}
if$
......@@ -1922,7 +1972,7 @@ FUNCTION { calc.basic.label }
if$
duplicate$
year empty.or.unknown
{ "[n. d.]" }
{ "[n.d.]" }
{ year field.or.null purify$ #-1 #4 substring$}
if$
*
......@@ -1970,7 +2020,7 @@ FUNCTION { calc.label }
% save the year for sort processing afterwards (adding a, b, c, etc.)
%
year empty.or.unknown
{ "[n. d.]" }
{ "[n.d.]" }
{ year field.or.null purify$ #-1 #4 substring$}
if$
'label.year :=
......@@ -2338,10 +2388,17 @@ FUNCTION { misc }
fin.entry
}
FUNCTION { online } { misc }
FUNCTION { online } { manual }
FUNCTION { game } { manual }
FUNCTION { artifactsoftware } { manual }
FUNCTION { artifactdataset } { manual }
FUNCTION { game } { misc }
FUNCTION { software } { manual }
FUNCTION { dataset } { manual }
FUNCTION { phdthesis }
{
......
......@@ -27,9 +27,9 @@
%% issue.
Attribute grammars (AGs) were originally introduced to describe
semantics for context free languages \cite{Knuth68semanticsof}. Given a context-free grammar,
semantics for context-free languages \cite{Knuth68semanticsof}. Given a context-free grammar,
attributes are associated to each of its productions. Attribute values are computed
in every node of the abstract syntax tree,
in every node of the abstract syntax tree
according to semantic rules that are expressed in terms of the attribute values
of the children and the parent. Attributes are classified in at least two sets: synthesized
attributes (where information flows bottom up) and inherited attibutes (where it
......@@ -50,9 +50,9 @@ programming language semantics, but as a general purpose programming paradigm.
%\AspectAG\ is a Haskell EDSL (Embedded Domain Specific Language) implementing first class attribute grammars,
%introduced by Viera \emph{et al} in 2009 \cite{Viera:2009:AGF:1596550.1596586}.
\AspectAG\ is a Haskell EDSL (Embedded Domain Specific Language), introduced by Viera \emph{et al}~\cite{Viera:2009:AGF:1596550.1596586}, that implements first class AGs.
\AspectAG\ is a Haskell EDSL (Embedded Domain Specific Language), introduced by Viera \emph{et al}~\cite{Viera:2009:AGF:1596550.1596586} that implements first class AGs.
It uses extensible polymorphic records and predicates encoded using old fashioned type
level programming features, such as Multi Parameter Typeclasses \cite{type-classes-an-exploration-of-the-design-space} and Functional Dependencies \cite{DBLP:conf/esop/Jones00},
level programming features, such as Multi Parameter Typeclasses \cite{type-classes-an-exploration-of-the-design-space} and Functional Dependencies \cite{DBLP:conf/esop/Jones00}
to ensure well-formedness of AGs at compile time.
An important drawback of EDSLs in general, and of \AspectAG\ in particular,
......@@ -76,11 +76,11 @@ More recent versions of GHC provide extensions to the type system to support a m
%sort-of dependent types in a more comfortable way.
Notably {\tt
TypeFamilies}~\cite{Chakravarty:2005:ATS:1090189.1086397, Sulzmann:2007:SFT:1190315.1190324}, to
define functions at type level, {\tt
DataKinds}~\cite{Yorgey:2012:GHP:2103786.2103795}, implementing data
promotion, {\tt PolyKinds} providing kind polymorphism, {\tt
define functions at type level; {\tt
DataKinds}~\cite{Yorgey:2012:GHP:2103786.2103795} implementing data
promotion; {\tt PolyKinds}, providing kind polymorphism; {\tt
KindSignatures} %~\cite{ghcman}
to document and deambiguate kinds, or
to document and deambiguate kinds; or
{\tt TypeApplications}~\cite{conf/esop/EisenbergWA16} to provide visible
application at type level.
%With recent additions to GHC this issues can be tackled.
......
......@@ -174,7 +174,7 @@ messages.
% Keywords. The author(s) should pick words that accurately describe the work
% being presented. Separate the keywords with commas.
\keywords{Attribute Grammars, EDSL, Type Level Programming, Haskell}
\keywords{Attribute Grammars, EDSL, Type-level Programming, Haskell}
% This command processes the author and affiliation and title information and
% builds the first part of the formatted document.
......
......@@ -53,7 +53,7 @@ variable names (given by strings), respectively. Both are said to be
of type |expr|, which we name with an index to refer them unambiguously.
\begin{figure}
\hline
\hrule
> type Nt_Expr = 'NT "Expr"
> expr = Label @ Nt_Expr
>
......@@ -68,7 +68,7 @@ of type |expr|, which we name with an index to refer them unambiguously.
> rightAdd = Label @ ('Chi "rightAdd" P_Add ('Left Nt_Expr))
> ival = Label @ ('Chi "ival" P_Val ('Right ('T Int)))
> vname = Label @ ('Chi "vname" P_Var ('Right ('T String)))
\hline
\hrule
\vspace{-0.1in}
\caption{Grammar declaration}\label{fig:gram}
\end{figure}
......@@ -121,7 +121,7 @@ follows:
%used as an EDSL with neither preprocessing nor postprocessing of the source code.
\begin{figure*}
\hline
\hrule
\numberson
> eval = Label @ ('Att "eval" Int) {-"\label{line:eval} "-}
> env = Label @ ('Att "env" (Map String Int)) {-"\label{line:env} "-}
......@@ -145,7 +145,7 @@ follows:
> evalExpr e m = sem_Expr asp e rootAtt #. eval {-"\label{line:evalExpr} "-}
> where rootAtt = env =. m .*. emptyAtt
\numbersoff
\hline
\hrule
\vspace{-0.1in}
\caption{Evaluation Semantics}\label{fig:eval}
......
......@@ -91,6 +91,7 @@ data OpLookup (c :: Type)
(r :: [(k, k')]) :: Type where
OpLookup :: Label l -> Rec c r -> OpLookup c l r
data OpLookup' (b :: Bool)
(c :: Type)
(l :: k)
......@@ -98,8 +99,6 @@ data OpLookup' (b :: Bool)
OpLookup' :: Proxy b -> Label l -> Rec c r -> OpLookup' b c l r
instance (Require (OpLookup' (l == l') c l ( '(l', v) ': r)) ctx)
=> Require (OpLookup c l ( '(l', v) ': r)) ctx where
type ReqR (OpLookup c l ( '(l', v) ': r))
......