{"action":"created","comment":{"url":"https://api.github.com/repos/spoofax-shell/doc/pulls/comments/67605867","id":67605867,"diff_hunk":"@@ -87,211 +119,139 @@ \\subsubsection{SDF3: syntax definition in Spoofax}\n The Spoofax API gives access to the generated parser through the\n \\texttt{SyntaxService}.\n \n-\\subsubsection{AST-based rules}\n-\\label{ssec:orgheadline2}\n-The meta-languages that will be discussed in the coming sections all\n-have one property in common: all of them use \\emph{rules} based on the AST\n-in order to specify one of the parts of a language definition. The\n-rules are said to be \\emph{syntax-directed}: the specification for one AST\n-node (whether it be a static semantics, rewriting or dynamic semantics\n-specification) is done by the specification of the children of that\n-AST node~\\cite{Winskel93}.\n-\n-\\subsection{Static Semantics}\n-\\label{ssec:static-analysis}\n-Static semantics refer to the meaning of what a well-formed program is\n-for a particular language~\\cite{Milner97}. This imposes more\n-constraints than syntax definition, such as name binding, scoping\n-rules and type checking. These cannot be specified by a syntax\n-definition alone and are thus considered separately.\n-\n-\\subsubsection{Declarative static semantics specification in Spoofax}\n-\\label{ssec:orgheadline3}\n-In Spoofax, all the static semantics as well as the dynamic semantics\n-used to be specified with the \\emph{Stratego} transformation language\n-(which is discussed in \\cref{ssec:term-rewrite}). Nowadays, two\n-high-level DSLs exist for specifying static semantics declaratively:\n-NaBL and TS. The two DSLs can work together: for instance, the type of\n-a variable can be set with NaBL, so that TS can be used to make\n-assertions on the type of that variable.\n-\n-The static analysis step of a language is exposed through the Spoofax\n-API by the \\texttt{AnalysisService}.\n-\n-\\subsubsection{NaBL: the Name Binding Language}\n-\\label{ssec:nabl}\n-With \\emph{NaBL} (pronounced \\emph{enable}), name binding and scoping can be\n-specified declaratively using AST-based\n-rules~\\cite{KonatKWV12}. Here is an example of name binding\n-and scoping rules for a class, from the \\emph{paplj}\n-language.\\footnote{paplj is used as an exercise language for the\n-``Declare Your Language'' book, which is a work-in-progress at the time\n-of writing. More information can be found here:\n-\\url{https://github.com/MetaBorgCube/declare-your-language}}\n-\\lstset{language=nabl,numbers=left}\n-\\begin{lstlisting}\n-namespaces Program Class Field Method Variable\n-// ...\n-binding rules\n-  Class(c, _, _, _) :\n-    defines Class c of type ClassT(c)\n-    // Declare new scope\n-    scopes Field, Method, Variable\n-    implicitly defines Variable This() of type ClassT(c)\n-\n-  Extends(c) :\n-    // Import namespaces from superclass\n-    imports Field, Method from Class c\n-\\end{lstlisting}\n-The most important concept to take away from this example is the way\n-the rules are specified on the AST: new scopes for names can be\n-defined on the level of an AST node, and can be imported again by\n-referring back to the scope definition.\n-\n-As can be seen from line 8, it can also associate type information\n-with names to interplay with TS. The type annotations can also be used\n-for instance when desugaring or rewriting with Stratego (see \\cref{ssec:term-rewrite}).\n-\n-\\subsubsection{TS: the Type Specification language}\n-\\label{ssec:orgheadline4}\n-Type checking can be done by specifying typing rules with the \\emph{TS}\n-DSL. Again an example of the paplj language:\n-\\lstset{language=type-spec,numbers=left}\n-\\begin{lstlisting}\n-type rules\n-  Class(c1, Extends(c2), _, _) :-\n-    where store ClassT(c1) <sub: ClassT(c2)\n-\n-  x@This() : t\n-    where definition of x : t\n-// ...\n-type rules\n-  Add(e1, e2) : NumT()\n-    where e1 : NumT() else error \"number expected\" on e1\n-      and e2 : NumT() else error \"number expected\" on e2\n+\\subsubsection{ASTs in Spoofax: Stratego Terms}\n+\\label{sec:asts-spoof-strat}\n+% TODO: Reference for Stratego terms.\n+In Spoofax, an AST is represented as a Stratego term, a format representing tree\n+structures that comes with a textual representation similar to formats such as\n+XML. As an example, a representation of the arithmetic expression $2 + 2 - 4$ is\n+shown in \\cref{lst:aterm-example}.\n+\n+\\begin{lstlisting}[caption={An example Stratego term representation of an\n+arithmetic expression},language=aterm,label={lst:aterm-example}]\n+Sub(Add(Int(\"2\"), Int(\"2\")), Int(\"4\"))\n \\end{lstlisting}\n-This example shows how in TS, the rules are syntax-directed: The\n-typing rule of the \\texttt{Add} node is specified by the types of its\n-children \\(e_1\\) and \\(e_2\\), on which the typing rules will be applied\n-recursively.\n-\n-Again, in line 6, interplay can be seen between TS an NaBL. Here the\n-type of a variable can be accessed, which is set in the NaBL\n-specification (see the previous subsection, \\cref{ssec:nabl}).\n \n-\\subsection{Term Rewriting and Program Transformation}\n-\\label{ssec:term-rewrite}\n-Sometimes the AST needs some form of transformation before it is to be\n-compiled or executed, for example to transform it to a canonical form,\n-or to perform optimizations such as constant folding. Program\n-transformations are specified by \\emph{term rewrite rules}: The left-hand\n-side of a rule introduces a pattern (for example \\(x + x\\)), and the\n-right-hand side specifies a replacement for it (e.g. \\(2\\cdot x\\)).\n-\n-\\subsubsection{Rewriting using Stratego}\n-\\label{ssec:orgheadline5}\n-Spoofax offers a DSL called \\emph{Stratego} for specifying program\n-transformation with rewrite rules~\\cite{Visser01}. Stratego can be\n-seen as the most general part of Spoofax: before NaBL and TS, Stratego\n-was used for specifying the static semantics. Moreover, being a\n-program transformation language, it can also serve as a compiler and\n-can thus be used to specify the dynamic semantics.\n-\n-An example of a rewrite rule for the paplj language is given below.\n-\\lstset{language=stratego,numbers=left}\n-\\begin{lstlisting}\n-rules\n-  desugar-let :\n-  \tLet([], e) -> e\n-\n-  desugar-let :\n-  \tLet([b1, b2 | bs], e) -> Let([b1], Let([b2 | bs], e))\n-\\end{lstlisting}\n-This desugars a \\texttt{let} expression with multiple bindings into multiple\n-nested \\texttt{let} expressions each having just one binding. Again it can be\n-seen that these are syntax-directed rules, from the way the rules are\n-specified using the AST.\n-\n-To construct the main algorithm of the program transformation,\n-Stratego has the notion of \\emph{strategies}. A strategy is used to specify\n-where and in what order the rewrite rules are applied to an\n-AST. Another example from paplj is given below:\n-\\lstset{language=stratego,numbers=left}\n-\\begin{lstlisting}\n-strategies\n-  pre-desugar =\n-    innermost(desugar-let <+ desugar-do)\n-\n-  post-desugar =\n-    innermost(desugar-do <+ desugar-get <+ desugar-set);\n-    resugar\n-\\end{lstlisting}\n-The strategy \\texttt{innermost} in this example is used to apply the strategy\n-given as parameter (a composition of rewrite rules) in a specific\n-traversal order on the AST nodes.\n-\n-The Spoofax API provides the \\texttt{TranformService} for performing program\n-transformation. Internally the \\texttt{TransformService} accesses the\n-Stratego runtime, which is retrieved from the\n-\\texttt{StrategoRuntimeService}. The same holds for the \\texttt{AnalysisService} of\n-the previous section: it too uses the Stratego runtime.\n-\n-Stratego furthermore has support for \\emph{native} strategies, which are\n-specified in Java instead. Therefore the interface is bidirectional:\n-Stratego can hook into Java, and Java can use the Stratego API.\n+Stratego terms can however represent any tree structure, not just ASTs. As such,\n+when using Spoofax programmatically through its API, one sees Stratego terms\n+used as an internal representation of the data going through the execution\n+pipeline depicted in \\cref{fig:spoofax-relations}.\n \n \\subsection{Dynamic Semantics}\n \\label{ssec:dynamic-semantics}\n Dynamic semantics refers to how a program written in some language\n-behaves~\\cite{Winskel93}. There are many approaches to formally\n-specify the dynamic semantics of a programming language (for an\n-extensive treatment, see~\\cite{Winskel93}). For this section only\n-one sort of approach called \\emph{operational semantics} is relevant.\n+behaves~\\cite{Winskel93}. There are many approaches to formally specify the\n+dynamic semantics of a programming language (for an extensive treatment,\n+see~\\cite{Winskel93}). One way, for example, is to specify the transformation of\n+programs written in the programming language to programs of another language of\n+which the dynamic semantics are already known.\n+\n+DynSem~\\cite{VerguNV15}, a DSL for the specification of dynamic semantics, uses\n+an approach called \\textit{operational semantics}. The rest of this section\n+discusses how DynSem (and operational semantics) is used to specify the dynamic\n+semantics of a language.\n \n \\subsubsection{DynSem: rule-based dynamic semantics}\n \\label{ssec:dynsem}\n-Aside from Stratego, the Spoofax team has developed an additional\n-method to declare the dynamic semantics of a language, namely a DSL\n-called \\emph{DynSem}~\\cite{VerguNV15}. DynSem allows for an operational\n-semantics specification from which a Java-based AST interpreter is\n-automatically generated.\n-\n-In DynSem, like other meta-languages in Spoofax, the dynamic semantics\n-are specified by means of syntax-directed rules. To show how rules can\n-define the dynamic semantics of a language, consider the classic\n-example of the \\(\\beta\\)-reduction, which defines function application in\n-the lambda calculus. The rule replaces all the occurences of the\n-parameter \\(x\\) with the argument \\(e_2\\), within the expression \\(e_1\\):\n-\n-\\begin{equation}\n-(\\lambda x.e_1) e_2 \\rightarrow e_1[x := e_2]\n-\\end{equation}\n-\n-In a similar way, dynamic semantics can be specified in DynSem using a\n-syntax very similar to the formal syntax used in the literature. Take\n-here the example of defining the behaviour of some boolean operators\n-in paplj:\n-\\lstset{language=dynsem,numbers=left}\n-\\begin{lstlisting}\n+Aside from Stratego, the Spoofax team has developed an additional method to\n+declare the dynamic semantics of a language, namely a DSL called\n+DynSem~\\cite{VerguNV15}. DynSem allows for an operational semantics\n+specification from which a Java-based AST interpreter can be automatically\n+derived.\n+\n+\\paragraph{Reduction rules} In DynSem and in operational semantics, reduction\n+rules are used to specify the dynamic semantics of a language, in a syntax\n+similar to the formal syntax like shown in\n+equation~(\\ref{eq:formal-spec}). \\Cref{lst:dynsem-rule-syntax} shows the syntax","path":"final/background/spoofax.tex","position":362,"original_position":362,"commit_id":"cccd3c3976dbcb012c73b9936dba640dedc33452","original_commit_id":"cccd3c3976dbcb012c73b9936dba640dedc33452","user":{"login":"Balletie","id":3884925,"avatar_url":"https://avatars.githubusercontent.com/u/3884925?v=3","gravatar_id":"","url":"https://api.github.com/users/Balletie","html_url":"https://github.com/Balletie","followers_url":"https://api.github.com/users/Balletie/followers","following_url":"https://api.github.com/users/Balletie/following{/other_user}","gists_url":"https://api.github.com/users/Balletie/gists{/gist_id}","starred_url":"https://api.github.com/users/Balletie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Balletie/subscriptions","organizations_url":"https://api.github.com/users/Balletie/orgs","repos_url":"https://api.github.com/users/Balletie/repos","events_url":"https://api.github.com/users/Balletie/events{/privacy}","received_events_url":"https://api.github.com/users/Balletie/received_events","type":"User","site_admin":false},"body":"that's how cref renders it too. I can remove it.","created_at":"2016-06-18T20:01:48Z","updated_at":"2016-06-18T20:01:48Z","html_url":"https://github.com/spoofax-shell/doc/pull/70#discussion_r67605867","pull_request_url":"https://api.github.com/repos/spoofax-shell/doc/pulls/70","_links":{"self":{"href":"https://api.github.com/repos/spoofax-shell/doc/pulls/comments/67605867"},"html":{"href":"https://github.com/spoofax-shell/doc/pull/70#discussion_r67605867"},"pull_request":{"href":"https://api.github.com/repos/spoofax-shell/doc/pulls/70"}}},"pull_request":{"url":"https://api.github.com/repos/spoofax-shell/doc/pulls/70","id":74170099,"html_url":"https://github.com/spoofax-shell/doc/pull/70","diff_url":"https://github.com/spoofax-shell/doc/pull/70.diff","patch_url":"https://github.com/spoofax-shell/doc/pull/70.patch","issue_url":"https://api.github.com/repos/spoofax-shell/doc/issues/70","number":70,"state":"open","locked":false,"title":"[RFC] Chapter 2: Rewrite Spoofax section","user":{"login":"Balletie","id":3884925,"avatar_url":"https://avatars.githubusercontent.com/u/3884925?v=3","gravatar_id":"","url":"https://api.github.com/users/Balletie","html_url":"https://github.com/Balletie","followers_url":"https://api.github.com/users/Balletie/followers","following_url":"https://api.github.com/users/Balletie/following{/other_user}","gists_url":"https://api.github.com/users/Balletie/gists{/gist_id}","starred_url":"https://api.github.com/users/Balletie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Balletie/subscriptions","organizations_url":"https://api.github.com/users/Balletie/orgs","repos_url":"https://api.github.com/users/Balletie/repos","events_url":"https://api.github.com/users/Balletie/events{/privacy}","received_events_url":"https://api.github.com/users/Balletie/received_events","type":"User","site_admin":false},"body":"This rewrites the Spoofax section according to the feedback given by Hendrik, and according to the decision of removing the unused parts of this section (static semantics and term rewriting).\r\n\r\nThe feedback that was processed is to provide a diagram for the execution model and the relation with the aspects of a language. See also #53.","created_at":"2016-06-16T23:44:41Z","updated_at":"2016-06-18T20:01:48Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9c765cf4ae871444b5c23f351a3569a9f2b29da3","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/spoofax-shell/doc/pulls/70/commits","review_comments_url":"https://api.github.com/repos/spoofax-shell/doc/pulls/70/comments","review_comment_url":"https://api.github.com/repos/spoofax-shell/doc/pulls/comments{/number}","comments_url":"https://api.github.com/repos/spoofax-shell/doc/issues/70/comments","statuses_url":"https://api.github.com/repos/spoofax-shell/doc/statuses/cccd3c3976dbcb012c73b9936dba640dedc33452","head":{"label":"spoofax-shell:spoofax-sec-rewrite","ref":"spoofax-sec-rewrite","sha":"cccd3c3976dbcb012c73b9936dba640dedc33452","user":{"login":"spoofax-shell","id":18665559,"avatar_url":"https://avatars.githubusercontent.com/u/18665559?v=3","gravatar_id":"","url":"https://api.github.com/users/spoofax-shell","html_url":"https://github.com/spoofax-shell","followers_url":"https://api.github.com/users/spoofax-shell/followers","following_url":"https://api.github.com/users/spoofax-shell/following{/other_user}","gists_url":"https://api.github.com/users/spoofax-shell/gists{/gist_id}","starred_url":"https://api.github.com/users/spoofax-shell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spoofax-shell/subscriptions","organizations_url":"https://api.github.com/users/spoofax-shell/orgs","repos_url":"https://api.github.com/users/spoofax-shell/repos","events_url":"https://api.github.com/users/spoofax-shell/events{/privacy}","received_events_url":"https://api.github.com/users/spoofax-shell/received_events","type":"Organization","site_admin":false},"repo":{"id":56597361,"name":"doc","full_name":"spoofax-shell/doc","owner":{"login":"spoofax-shell","id":18665559,"avatar_url":"https://avatars.githubusercontent.com/u/18665559?v=3","gravatar_id":"","url":"https://api.github.com/users/spoofax-shell","html_url":"https://github.com/spoofax-shell","followers_url":"https://api.github.com/users/spoofax-shell/followers","following_url":"https://api.github.com/users/spoofax-shell/following{/other_user}","gists_url":"https://api.github.com/users/spoofax-shell/gists{/gist_id}","starred_url":"https://api.github.com/users/spoofax-shell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spoofax-shell/subscriptions","organizations_url":"https://api.github.com/users/spoofax-shell/orgs","repos_url":"https://api.github.com/users/spoofax-shell/repos","events_url":"https://api.github.com/users/spoofax-shell/events{/privacy}","received_events_url":"https://api.github.com/users/spoofax-shell/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/spoofax-shell/doc","description":"TI3806 documents","fork":false,"url":"https://api.github.com/repos/spoofax-shell/doc","forks_url":"https://api.github.com/repos/spoofax-shell/doc/forks","keys_url":"https://api.github.com/repos/spoofax-shell/doc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/spoofax-shell/doc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/spoofax-shell/doc/teams","hooks_url":"https://api.github.com/repos/spoofax-shell/doc/hooks","issue_events_url":"https://api.github.com/repos/spoofax-shell/doc/issues/events{/number}","events_url":"https://api.github.com/repos/spoofax-shell/doc/events","assignees_url":"https://api.github.com/repos/spoofax-shell/doc/assignees{/user}","branches_url":"https://api.github.com/repos/spoofax-shell/doc/branches{/branch}","tags_url":"https://api.github.com/repos/spoofax-shell/doc/tags","blobs_url":"https://api.github.com/repos/spoofax-shell/doc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/spoofax-shell/doc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/spoofax-shell/doc/git/refs{/sha}","trees_url":"https://api.github.com/repos/spoofax-shell/doc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/spoofax-shell/doc/statuses/{sha}","languages_url":"https://api.github.com/repos/spoofax-shell/doc/languages","stargazers_url":"https://api.github.com/repos/spoofax-shell/doc/stargazers","contributors_url":"https://api.github.com/repos/spoofax-shell/doc/contributors","subscribers_url":"https://api.github.com/repos/spoofax-shell/doc/subscribers","subscription_url":"https://api.github.com/repos/spoofax-shell/doc/subscription","commits_url":"https://api.github.com/repos/spoofax-shell/doc/commits{/sha}","git_commits_url":"https://api.github.com/repos/spoofax-shell/doc/git/commits{/sha}","comments_url":"https://api.github.com/repos/spoofax-shell/doc/comments{/number}","issue_comment_url":"https://api.github.com/repos/spoofax-shell/doc/issues/comments{/number}","contents_url":"https://api.github.com/repos/spoofax-shell/doc/contents/{+path}","compare_url":"https://api.github.com/repos/spoofax-shell/doc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/spoofax-shell/doc/merges","archive_url":"https://api.github.com/repos/spoofax-shell/doc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/spoofax-shell/doc/downloads","issues_url":"https://api.github.com/repos/spoofax-shell/doc/issues{/number}","pulls_url":"https://api.github.com/repos/spoofax-shell/doc/pulls{/number}","milestones_url":"https://api.github.com/repos/spoofax-shell/doc/milestones{/number}","notifications_url":"https://api.github.com/repos/spoofax-shell/doc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/spoofax-shell/doc/labels{/name}","releases_url":"https://api.github.com/repos/spoofax-shell/doc/releases{/id}","deployments_url":"https://api.github.com/repos/spoofax-shell/doc/deployments","created_at":"2016-04-19T13:05:31Z","updated_at":"2016-05-01T18:51:51Z","pushed_at":"2016-06-18T19:31:51Z","git_url":"git://github.com/spoofax-shell/doc.git","ssh_url":"git@github.com:spoofax-shell/doc.git","clone_url":"https://github.com/spoofax-shell/doc.git","svn_url":"https://github.com/spoofax-shell/doc","homepage":"","size":6189,"stargazers_count":0,"watchers_count":0,"language":"TeX","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":12,"forks":0,"open_issues":12,"watchers":0,"default_branch":"master"}},"base":{"label":"spoofax-shell:master","ref":"master","sha":"0c47d75f7eb534f5c904fcc0d23f4727fb2e0aff","user":{"login":"spoofax-shell","id":18665559,"avatar_url":"https://avatars.githubusercontent.com/u/18665559?v=3","gravatar_id":"","url":"https://api.github.com/users/spoofax-shell","html_url":"https://github.com/spoofax-shell","followers_url":"https://api.github.com/users/spoofax-shell/followers","following_url":"https://api.github.com/users/spoofax-shell/following{/other_user}","gists_url":"https://api.github.com/users/spoofax-shell/gists{/gist_id}","starred_url":"https://api.github.com/users/spoofax-shell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spoofax-shell/subscriptions","organizations_url":"https://api.github.com/users/spoofax-shell/orgs","repos_url":"https://api.github.com/users/spoofax-shell/repos","events_url":"https://api.github.com/users/spoofax-shell/events{/privacy}","received_events_url":"https://api.github.com/users/spoofax-shell/received_events","type":"Organization","site_admin":false},"repo":{"id":56597361,"name":"doc","full_name":"spoofax-shell/doc","owner":{"login":"spoofax-shell","id":18665559,"avatar_url":"https://avatars.githubusercontent.com/u/18665559?v=3","gravatar_id":"","url":"https://api.github.com/users/spoofax-shell","html_url":"https://github.com/spoofax-shell","followers_url":"https://api.github.com/users/spoofax-shell/followers","following_url":"https://api.github.com/users/spoofax-shell/following{/other_user}","gists_url":"https://api.github.com/users/spoofax-shell/gists{/gist_id}","starred_url":"https://api.github.com/users/spoofax-shell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spoofax-shell/subscriptions","organizations_url":"https://api.github.com/users/spoofax-shell/orgs","repos_url":"https://api.github.com/users/spoofax-shell/repos","events_url":"https://api.github.com/users/spoofax-shell/events{/privacy}","received_events_url":"https://api.github.com/users/spoofax-shell/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/spoofax-shell/doc","description":"TI3806 documents","fork":false,"url":"https://api.github.com/repos/spoofax-shell/doc","forks_url":"https://api.github.com/repos/spoofax-shell/doc/forks","keys_url":"https://api.github.com/repos/spoofax-shell/doc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/spoofax-shell/doc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/spoofax-shell/doc/teams","hooks_url":"https://api.github.com/repos/spoofax-shell/doc/hooks","issue_events_url":"https://api.github.com/repos/spoofax-shell/doc/issues/events{/number}","events_url":"https://api.github.com/repos/spoofax-shell/doc/events","assignees_url":"https://api.github.com/repos/spoofax-shell/doc/assignees{/user}","branches_url":"https://api.github.com/repos/spoofax-shell/doc/branches{/branch}","tags_url":"https://api.github.com/repos/spoofax-shell/doc/tags","blobs_url":"https://api.github.com/repos/spoofax-shell/doc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/spoofax-shell/doc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/spoofax-shell/doc/git/refs{/sha}","trees_url":"https://api.github.com/repos/spoofax-shell/doc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/spoofax-shell/doc/statuses/{sha}","languages_url":"https://api.github.com/repos/spoofax-shell/doc/languages","stargazers_url":"https://api.github.com/repos/spoofax-shell/doc/stargazers","contributors_url":"https://api.github.com/repos/spoofax-shell/doc/contributors","subscribers_url":"https://api.github.com/repos/spoofax-shell/doc/subscribers","subscription_url":"https://api.github.com/repos/spoofax-shell/doc/subscription","commits_url":"https://api.github.com/repos/spoofax-shell/doc/commits{/sha}","git_commits_url":"https://api.github.com/repos/spoofax-shell/doc/git/commits{/sha}","comments_url":"https://api.github.com/repos/spoofax-shell/doc/comments{/number}","issue_comment_url":"https://api.github.com/repos/spoofax-shell/doc/issues/comments{/number}","contents_url":"https://api.github.com/repos/spoofax-shell/doc/contents/{+path}","compare_url":"https://api.github.com/repos/spoofax-shell/doc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/spoofax-shell/doc/merges","archive_url":"https://api.github.com/repos/spoofax-shell/doc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/spoofax-shell/doc/downloads","issues_url":"https://api.github.com/repos/spoofax-shell/doc/issues{/number}","pulls_url":"https://api.github.com/repos/spoofax-shell/doc/pulls{/number}","milestones_url":"https://api.github.com/repos/spoofax-shell/doc/milestones{/number}","notifications_url":"https://api.github.com/repos/spoofax-shell/doc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/spoofax-shell/doc/labels{/name}","releases_url":"https://api.github.com/repos/spoofax-shell/doc/releases{/id}","deployments_url":"https://api.github.com/repos/spoofax-shell/doc/deployments","created_at":"2016-04-19T13:05:31Z","updated_at":"2016-05-01T18:51:51Z","pushed_at":"2016-06-18T19:31:51Z","git_url":"git://github.com/spoofax-shell/doc.git","ssh_url":"git@github.com:spoofax-shell/doc.git","clone_url":"https://github.com/spoofax-shell/doc.git","svn_url":"https://github.com/spoofax-shell/doc","homepage":"","size":6189,"stargazers_count":0,"watchers_count":0,"language":"TeX","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":12,"forks":0,"open_issues":12,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/spoofax-shell/doc/pulls/70"},"html":{"href":"https://github.com/spoofax-shell/doc/pull/70"},"issue":{"href":"https://api.github.com/repos/spoofax-shell/doc/issues/70"},"comments":{"href":"https://api.github.com/repos/spoofax-shell/doc/issues/70/comments"},"review_comments":{"href":"https://api.github.com/repos/spoofax-shell/doc/pulls/70/comments"},"review_comment":{"href":"https://api.github.com/repos/spoofax-shell/doc/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/spoofax-shell/doc/pulls/70/commits"},"statuses":{"href":"https://api.github.com/repos/spoofax-shell/doc/statuses/cccd3c3976dbcb012c73b9936dba640dedc33452"}}}}
{"actor":{"display_login":"Balletie"}}