{"publications":[{"abstract":"Integrated development environments (IDEs) increase programmer productivity, providing rapid, interactive feedback based on the syntax and semantics of a language. A heavy burden lies on developers of new languages to provide adequate IDE support. Code generation techniques provide a viable, efficient approach to semi-automatically produce IDE plugins. Key components for the realization of plugins are the language's grammar and parser. For embedded languages and language extensions, constituent IDE plugin modules and their grammars can be combined. Unlike conventional parsing algorithms, scannerless generalized-LR parsing supports the full set of context-free grammars, which is closed under composition, and hence can parse language embeddings and extensions composed from separate grammar modules. To apply this algorithm in an interactive environment, this paper introduces a novel error recovery mechanism, which allows it to be used with files with syntax errors -- common in interactive editing. Error recovery is vital for providing rapid feedback in case of syntax errors, as most IDE services depend on the parser -- from syntax highlighting to semantic analysis and cross-referencing. We base our approach on the principles of island grammars, and derive permissive grammars with error recovery productions from normal SDF grammars. To cope with the added complexity of these grammars, we adapt the parser to support backtracking. We evaluate the recovery quality and performance of our approach using a set of composed languages, based on Java and Stratego. ","conferenceYear":"","series":"","lastpage":464,"booktitle":"Proceedings of the 24th Annual ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications, OOPSLA 2009, October 25-29, 2009, Orlando, Florida, USA","number":"","editors":[{"alias":{"id":"0c07716a-6765-46eb-adf2-127d0d707917","name":"Shail Arora","key":"shail-arora","url":"http://researchr.org/alias/shail-arora"}},{"alias":{"id":"1a42cab0-1af8-42b8-b90d-096a5ec5440d","name":"Gary T. Leavens","key":"gary-t.-leavens","url":"http://researchr.org/alias/gary-t.-leavens"}}],"type":"inproceedings","url":"http://researchr.org/publication/KatsJNV09","firstpage":445,"publisher":"ACM","id":"232e4c5f-180d-4eb0-8fab-0d21c12eb66b","authors":[{"person":{"id":"6e29bb96-28c9-4c76-915d-160ef1947602","fullname":"Lennart C. L. Kats","key":"lennartclkats","url":"http://researchr.org/profile/lennartclkats"},"alias":{"id":"f6b6789b-a32a-417c-a90e-c37a12f25728","name":"Lennart C. L. Kats","key":"lennart-c.-l.-kats","url":"http://researchr.org/alias/lennart-c.-l.-kats"}},{"person":{"id":"195eff8f-ca21-4c28-8b32-d60a0bcec22c","fullname":"Maartje  de Jonge","key":"maartjedejonge","url":"http://researchr.org/profile/maartjedejonge"},"alias":{"id":"dcf00ea7-8042-4c07-8f81-9498e4c4a6f7","name":"Maartje de Jonge","key":"maartje-de-jonge","url":"http://researchr.org/alias/maartje-de-jonge"}},{"person":{"id":"3f77872b-c6b8-42dd-bf3b-4f66dc371407","fullname":"Emma  Nilsson-Nyman","key":"emmanilssonnyman","url":"http://researchr.org/profile/emmanilssonnyman"},"alias":{"id":"acb79742-eafa-497b-9ba1-b9d3f9258506","name":"Emma Nilsson-Nyman","key":"emma-nilsson-nyman","url":"http://researchr.org/alias/emma-nilsson-nyman"}},{"person":{"id":"f0fbf7c0-9729-4ec8-b3c9-5f30dbd9614b","fullname":"Eelco Visser","key":"eelcovisser","url":"http://researchr.org/profile/eelcovisser"},"alias":{"id":"f68ba0ee-899e-4c4c-9d8a-6fed5092830a","name":"Eelco Visser","key":"eelco-visser","url":"http://researchr.org/alias/eelco-visser"}}],"title":"Providing rapid feedback in generated modular language environments: adding error recovery to scannerless generalized-LR parsing","organization":"","address":"","month":"","volume":"","year":"2009","conference":"oopsla","note":"","doi":"http://doi.acm.org/10.1145/1640089.1640122","key":"KatsJNV09"},{"abstract":"Parser generators are an indispensable tool for rapid language development. However, they often fall short of the finesse of a hand-crafted parser, built with the language semantics in mind. One area where generated parsers have provided unsatisfactory results is that of error recovery. Good error recovery is both natural, giving recovery suggestions in line with the intention of the programmer; and flexible, allowing it to be adapted according to language insights and language changes. This paper describes a novel approach to error recovery, taking into account not only the context-free grammar, but also indentation usage. We base our approach on an extension of the SGLR parser that supports fine-grained error recovery rules and can be used to parse complex, composed languages. We take a divide-and-conquer approach to error recovery: using indentation, erroneous regions of code are identified. These regions constrain the search space for applying recovery rules, improving performance and ensuring recovery suggestions local to the error. As a last resort, erroneous regions can be discarded. Our approach also integrates bridge parsing to provide more accurate suggestions for indentation-sensitive language constructs such as scopes. We evaluate our approach by comparison with the JDT Java parser used in Eclipse. ","conferenceYear":"","series":"Lecture Notes in Computer Science","lastpage":223,"booktitle":"Software Language Engineering, Second International Conference, SLE 2009, Denver, CO, USA, October 5-6, 2009, Revised Selected Papers","number":"","editors":[{"person":{"id":"97855301-a569-413e-8e19-c2c376c50842","fullname":"Mark G. J. van den Brand","key":"markgjvandenbrand","url":"http://researchr.org/profile/markgjvandenbrand"},"alias":{"id":"ec0da5fa-6834-4952-9fff-9c4fecce7cb7","name":"Mark van den Brand","key":"mark-van-den-brand","url":"http://researchr.org/alias/mark-van-den-brand"}},{"person":{"id":"892937c7-d9f9-49a8-89e6-734b1fb47253","fullname":"Dragan Gasevic","key":"dragangasevic","url":"http://researchr.org/profile/dragangasevic"},"alias":{"id":"4e952583-7834-4817-8b6e-04feaa97fad9","name":"Dragan Gasevic","key":"dragan-gasevic","url":"http://researchr.org/alias/dragan-gasevic"}},{"person":{"id":"474ab36e-49c3-4f85-aa00-417d49005952","fullname":"Jeffrey G. Gray","key":"jeffgray","url":"http://researchr.org/profile/jeffgray"},"alias":{"id":"fefac3e9-8142-40df-9285-12943249e210","name":"Jeff Gray","key":"jeff-gray","url":"http://researchr.org/alias/jeff-gray"}}],"type":"inproceedings","url":"http://researchr.org/publication/JongeNKV09","firstpage":204,"publisher":"Springer","id":"497b9673-b265-4da8-a8ac-78e1aebd4526","authors":[{"person":{"id":"195eff8f-ca21-4c28-8b32-d60a0bcec22c","fullname":"Maartje  de Jonge","key":"maartjedejonge","url":"http://researchr.org/profile/maartjedejonge"},"alias":{"id":"dcf00ea7-8042-4c07-8f81-9498e4c4a6f7","name":"Maartje de Jonge","key":"maartje-de-jonge","url":"http://researchr.org/alias/maartje-de-jonge"}},{"person":{"id":"3f77872b-c6b8-42dd-bf3b-4f66dc371407","fullname":"Emma  Nilsson-Nyman","key":"emmanilssonnyman","url":"http://researchr.org/profile/emmanilssonnyman"},"alias":{"id":"acb79742-eafa-497b-9ba1-b9d3f9258506","name":"Emma Nilsson-Nyman","key":"emma-nilsson-nyman","url":"http://researchr.org/alias/emma-nilsson-nyman"}},{"person":{"id":"6e29bb96-28c9-4c76-915d-160ef1947602","fullname":"Lennart C. L. Kats","key":"lennartclkats","url":"http://researchr.org/profile/lennartclkats"},"alias":{"id":"f6b6789b-a32a-417c-a90e-c37a12f25728","name":"Lennart C. L. Kats","key":"lennart-c.-l.-kats","url":"http://researchr.org/alias/lennart-c.-l.-kats"}},{"person":{"id":"f0fbf7c0-9729-4ec8-b3c9-5f30dbd9614b","fullname":"Eelco Visser","key":"eelcovisser","url":"http://researchr.org/profile/eelcovisser"},"alias":{"id":"f68ba0ee-899e-4c4c-9d8a-6fed5092830a","name":"Eelco Visser","key":"eelco-visser","url":"http://researchr.org/alias/eelco-visser"}}],"title":"Natural and Flexible Error Recovery for Generated Parsers","organization":"","address":"","month":"","volume":"5969","year":"2009","conference":"sle","note":"","doi":"http://dx.doi.org/10.1007/978-3-642-12107-4_16","key":"JongeNKV09"},{"abstract":"The reliability of implementations of language definitions\r\n\u2013 compilers, interpreters, and development environments \u2013\r\nis essential for effective software development and maintenance.\r\nThey are often tested only as an afterthought.\r\nLanguages with a smaller scope, such as domain-specific\r\nlanguages, often remain untested. General-purpose testing\r\ntechniques and test case generation methods fall short in\r\nproviding a low-threshold solution for test-driven language\r\ndevelopment. In this paper we introduce the notion of a\r\nlanguage-parametric testing language (LPTL) that provides\r\na reusable, generic basis for declaratively specifying language\r\ndefinition tests. We integrate the syntax, semantics,\r\nand editor services of a language under test into the LPTL\r\nfor writing test inputs. This paper describes the design of an\r\nLPTL and the tool support provided for it, shows use cases\r\nusing examples, and describes our implementation in the\r\nform of the Spoofax testing language.","conferenceYear":"","series":"","lastpage":154,"booktitle":"Proceedings of the 2011 ACM international conference on Object oriented programming systems languages and applications, OOPSLA 2011","number":"","editors":[{"person":{"id":"cb10db3c-8c94-4190-ba6b-c0a09d673b01","fullname":"Kathleen Fisher","key":"kathleenfisher","url":"http://researchr.org/profile/kathleenfisher"},"alias":{"id":"e0e131f2-6a9a-4b6c-804b-058cdfb5d2e2","name":"Kathleen Fisher","key":"kathleen-fisher","url":"http://researchr.org/alias/kathleen-fisher"}},{"person":{"id":"59a2d3a5-8c38-4bee-a335-d0518f11800f","fullname":"Cristina Videira  Lopes","key":"cristinavideiralopes","url":"http://researchr.org/profile/cristinavideiralopes"},"alias":{"id":"7e59d9ab-6822-40bf-8bc6-7a614a58ef35","name":"Cristina Videira Lopes","key":"cristina-videira-lopes","url":"http://researchr.org/alias/cristina-videira-lopes"}}],"type":"inproceedings","url":"http://researchr.org/publication/KatsVermaasVisser2011","firstpage":139,"publisher":"ACM","id":"85e3f105-2114-4d24-bc34-d7acc4cb9e2b","authors":[{"person":{"id":"6e29bb96-28c9-4c76-915d-160ef1947602","fullname":"Lennart C. L. Kats","key":"lennartclkats","url":"http://researchr.org/profile/lennartclkats"},"alias":{"id":"f6b6789b-a32a-417c-a90e-c37a12f25728","name":"Lennart C. L. Kats","key":"lennart-c.-l.-kats","url":"http://researchr.org/alias/lennart-c.-l.-kats"}},{"person":{"id":"f6aa2423-57ab-44c6-909c-dd1d19dfbe85","fullname":"Rob Vermaas","key":"robvermaas","url":"http://researchr.org/profile/robvermaas"},"alias":{"id":"6a38d57e-6acc-4105-be50-25e9b31b00fa","name":"Rob Vermaas","key":"rob-vermaas","url":"http://researchr.org/alias/rob-vermaas"}},{"person":{"id":"f0fbf7c0-9729-4ec8-b3c9-5f30dbd9614b","fullname":"Eelco Visser","key":"eelcovisser","url":"http://researchr.org/profile/eelcovisser"},"alias":{"id":"f68ba0ee-899e-4c4c-9d8a-6fed5092830a","name":"Eelco Visser","key":"eelco-visser","url":"http://researchr.org/alias/eelco-visser"}}],"title":"Integrated Language Definition Testing. Enabling Test-Driven Language Development","organization":"","address":"New York, NY, USA","month":"","volume":"","year":"2011","conference":"OOPSLA","note":"","doi":"http://dx.doi.org/10.1145/2048066.2048080","key":"KatsVermaasVisser2011"},{"abstract":"In meta-programming with concrete object syntax, meta programs can be\r\nwritten using the concrete syntax of manipulated programs.  Quotations\r\nof concrete syntax fragments and anti-quotations for meta-level\r\nexpressions and variables are used to manipulate the abstract\r\nrepresentation of programs.  These small, isolated fragments are often\r\nambiguous and must be explicitly disambiguated with quotation tags or\r\ntypes, using names from the non-terminals of the object language\r\nsyntax.  Discoverability of these names has been an open issue, as\r\nthey depend on the (grammar) implementation and are not part of the\r\nconcrete syntax of a language.  Based on advances in interactive\r\ndevelopment environments, we introduce _interactive disambiguation_ to\r\naddress this issue, providing real-time feedback and proposing quick\r\nfixes in case of ambiguities.\r\n","conferenceYear":"2010","series":"Lecture Notes in Computer Science","lastpage":0,"booktitle":"Software Language Engineering, Third International Conference, SLE 2010, Eindhoven, The Netherlands, October 12-13, 2010, Revised Selected Papers","number":"","editors":[{"person":{"id":"97855301-a569-413e-8e19-c2c376c50842","fullname":"Mark G. J. van den Brand","key":"markgjvandenbrand","url":"http://researchr.org/profile/markgjvandenbrand"},"alias":{"id":"ec0da5fa-6834-4952-9fff-9c4fecce7cb7","name":"Mark van den Brand","key":"mark-van-den-brand","url":"http://researchr.org/alias/mark-van-den-brand"}},{"alias":{"id":"656064e2-e4fc-45ea-b03b-abc5e7783b99","name":"Brian Malloy","key":"brian-malloy","url":"http://researchr.org/alias/brian-malloy"}},{"alias":{"id":"38c08b6b-f450-4293-9d46-4ca937072e67","name":"Steffen Staab","key":"steffen-staab","url":"http://researchr.org/alias/steffen-staab"}}],"type":"inproceedings","url":"http://researchr.org/publication/KatsKV-SLE-2010","firstpage":0,"publisher":"Springer","id":"8ba7b2bf-84e7-4fa6-9ff0-5fe7d83e1ad5","authors":[{"person":{"id":"6e29bb96-28c9-4c76-915d-160ef1947602","fullname":"Lennart C. L. Kats","key":"lennartclkats","url":"http://researchr.org/profile/lennartclkats"},"alias":{"id":"f6b6789b-a32a-417c-a90e-c37a12f25728","name":"Lennart C. L. Kats","key":"lennart-c.-l.-kats","url":"http://researchr.org/alias/lennart-c.-l.-kats"}},{"person":{"id":"d774aeed-7606-4770-8a56-2cf4990644b4","fullname":"Karl Trygve Kalleberg","key":"karltk","url":"http://researchr.org/profile/karltk"},"alias":{"id":"3ee71cd9-6b84-45a5-ab19-8f8783c8dba3","name":"Karl Trygve Kalleberg","key":"karl-trygve-kalleberg","url":"http://researchr.org/alias/karl-trygve-kalleberg"}},{"person":{"id":"f0fbf7c0-9729-4ec8-b3c9-5f30dbd9614b","fullname":"Eelco Visser","key":"eelcovisser","url":"http://researchr.org/profile/eelcovisser"},"alias":{"id":"f68ba0ee-899e-4c4c-9d8a-6fed5092830a","name":"Eelco Visser","key":"eelco-visser","url":"http://researchr.org/alias/eelco-visser"}}],"title":"Interactive Disambiguation of Meta Programs with Concrete Object Syntax","organization":"","address":"","month":"","volume":"","year":"2011","conference":"SLE","note":"","doi":"","key":"KatsKV-SLE-2010"},{"abstract":"Software platforms such as the Java Virtual Machine or the CLR .NET\r\nvirtual machine have their own ecosystem of a core programming\r\nlanguage or instruction set, libraries, and developer community.\r\nProgramming languages can target multiple software platforms to\r\nincrease interoperability or to boost performance.\r\nIntroducing a new compiler backend for a language is the first step\r\ntowards targeting a new platform, translating the language to the\r\nplatform's language or instruction set.\r\nPrograms written in modern languages generally make extensive use of\r\nAPIs, based on the runtime system of the software platform,\r\nintroducing additional portability concerns.\r\nThey may use APIs that are implemented by platform-specific\r\nlibraries. Libraries may perform platform-specific operations, make\r\ndirect native calls, or make assumptions about performance\r\ncharacteristics of operations or about the file system.\r\n\r\nThis paper proposes to use aspect weaving to invasively adapt programs\r\nand libraries to address such portability concerns,\r\nand identifies four classes of aspects for this purpose.\r\nWe evaluate this approach through a case study where we retarget the\r\nStratego program transformation language towards the Java Virtual\r\nMachine.","conferenceYear":"","series":"","lastpage":0,"booktitle":"Proceedings of the Tenth IEEE International Working Conference on Source Code Analysis and Manipulation 2010","number":"","editors":[{"person":{"id":"1aca1e26-166a-4bd5-807d-3eca8accdf25","fullname":"Cristina Marinescu","key":"cristinamarinescu","url":"http://researchr.org/profile/cristinamarinescu"},"alias":{"id":"86dc83e7-4988-4e0f-919c-71d291f3fbbc","name":"Cristina Marinescu","key":"cristina-marinescu","url":"http://researchr.org/alias/cristina-marinescu"}},{"person":{"id":"8ed1149d-5533-4120-8079-88085c44c8ef","fullname":"Jurgen J.  Vinju","key":"jurgenjvinju","url":"http://researchr.org/profile/jurgenjvinju"},"alias":{"id":"b192b666-9f59-43fd-8c2d-bf9b302c615e","name":"Jurgen Vinju","key":"jurgen-vinju","url":"http://researchr.org/alias/jurgen-vinju"}}],"type":"inproceedings","url":"http://researchr.org/publication/KatsVisser-SCAM-2010","firstpage":0,"publisher":"","id":"ac13678a-08f3-43c5-a989-925d1bf638b5","authors":[{"person":{"id":"6e29bb96-28c9-4c76-915d-160ef1947602","fullname":"Lennart C. L. Kats","key":"lennartclkats","url":"http://researchr.org/profile/lennartclkats"},"alias":{"id":"f6b6789b-a32a-417c-a90e-c37a12f25728","name":"Lennart C. L. Kats","key":"lennart-c.-l.-kats","url":"http://researchr.org/alias/lennart-c.-l.-kats"}},{"person":{"id":"f0fbf7c0-9729-4ec8-b3c9-5f30dbd9614b","fullname":"Eelco Visser","key":"eelcovisser","url":"http://researchr.org/profile/eelcovisser"},"alias":{"id":"f68ba0ee-899e-4c4c-9d8a-6fed5092830a","name":"Eelco Visser","key":"eelco-visser","url":"http://researchr.org/alias/eelco-visser"}}],"title":"Encapsulating Software Platform Logic by Aspect-Oriented Programming: A Case Study in Using Aspects for Language Portability","organization":"","address":"","month":"","volume":"","year":"2010","conference":"SCAM","note":"","doi":"","key":"KatsVisser-SCAM-2010"},{"abstract":"Language extensions increase programmer productivity by providing concise, often domain-specific syntax, and support for static verification of correctness, security, and style constraints. Language extensions can often be realized through translation to the base language, supported by preprocessors and extensible compilers. However, various kinds of extensions require further adaptation of a base compiler's internal stages and components, for example to support separate compilation or to make use of low-level primitives of the platform (e.g., jump instructions or unbalanced synchronization). To allow for a more loosely coupled approach, we propose an open compiler model based on normalization steps from a high-level language to a subset of it, the core language. We developed such a compiler for a mixed Java and (core) bytecode language, and evaluate its effectiveness for composition mechanisms such as traits, as well as statement-level and expression-level language extensions.\r\n\r\n","conferenceYear":"","series":"","lastpage":108,"booktitle":"Proceedings of the 23rd Annual ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications, OOPSLA 2008, October 19-23, 2008, Nashville, TN, USA","number":"","editors":[{"alias":{"id":"af52a55a-04f9-476c-a946-013c96a7023e","name":"Gail E. Harris","key":"gail-e.-harris","url":"http://researchr.org/alias/gail-e.-harris"}}],"type":"inproceedings","url":"http://researchr.org/publication/KatsBV08","firstpage":91,"publisher":"ACM","id":"c4413cee-a32d-4df1-85ab-01dd3c8e9361","authors":[{"person":{"id":"6e29bb96-28c9-4c76-915d-160ef1947602","fullname":"Lennart C. L. Kats","key":"lennartclkats","url":"http://researchr.org/profile/lennartclkats"},"alias":{"id":"f6b6789b-a32a-417c-a90e-c37a12f25728","name":"Lennart C. L. Kats","key":"lennart-c.-l.-kats","url":"http://researchr.org/alias/lennart-c.-l.-kats"}},{"person":{"id":"629a35fe-abf1-4cd3-ad19-ae3021609c90","fullname":"Martin  Bravenboer","key":"martinbravenboer","url":"http://researchr.org/profile/martinbravenboer"},"alias":{"id":"d43052f6-9073-47d6-98d0-b38cb940c618","name":"Martin Bravenboer","key":"martin-bravenboer","url":"http://researchr.org/alias/martin-bravenboer"}},{"person":{"id":"f0fbf7c0-9729-4ec8-b3c9-5f30dbd9614b","fullname":"Eelco Visser","key":"eelcovisser","url":"http://researchr.org/profile/eelcovisser"},"alias":{"id":"f68ba0ee-899e-4c4c-9d8a-6fed5092830a","name":"Eelco Visser","key":"eelco-visser","url":"http://researchr.org/alias/eelco-visser"}}],"title":"Mixing source and bytecode: a case for compilation by normalization","organization":"","address":"","month":"","volume":"","year":"2008","conference":"oopsla","note":"","doi":"http://doi.acm.org/10.1145/1449764.1449772","key":"KatsBV08"},{"abstract":"Spoofax is a language workbench for efficient, agile development of textual domain-specific languages with state-of-the-art IDE support. Spoofax integrates language processing techniques for parser generation, meta-programming, and IDE development into a single environment. It uses concise, declarative specifications for languages and IDE services. In this paper we describe the architecture of Spoofax and introduce idioms for high-level specifications of language semantics using rewrite rules, showing how analyses can be reused for transformations, code generation, and editor services such as error marking, reference resolving, and content completion. The implementation of these services is supported by language-parametric editor service classes that can be dynamically loaded by the Eclipse IDE, allowing new languages to be developed and used side-by-side in the same Eclipse environment.","conferenceYear":"","series":"","lastpage":463,"booktitle":"Proceedings of the 25th Annual ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications, OOPSLA 2010, October 17-21, 2010, Reno/Tahoe, Nevada, USA","number":"","editors":[{"person":{"id":"7f55f747-1ff4-4fa3-85ea-b40e083546b5","fullname":"William R. Cook","key":"williamrcook","url":"http://researchr.org/profile/williamrcook"},"alias":{"id":"9a3ff127-3980-45d1-8b6b-baa769285bbc","name":"William R. Cook","key":"william-r.-cook","url":"http://researchr.org/alias/william-r.-cook"}},{"person":{"id":"ed27bbb0-cb5a-499a-a50b-f5a211ae3647","fullname":"Siobhán Clarke","key":"siobhnclarke","url":"http://researchr.org/profile/siobhnclarke"},"alias":{"id":"a3306b32-66ba-486a-b518-c8019b0e80a0","name":"Siobh{\\'a}n Clarke","key":"siobh{\\'a}n-clarke","url":"http://researchr.org/alias/siobh%7B%5Eb%27a%7Dn-clarke"}},{"alias":{"id":"503be362-fe58-475e-81c6-7763a1803fb6","name":"Martin C. Rinard","key":"martin-c.-rinard","url":"http://researchr.org/alias/martin-c.-rinard"}}],"type":"inproceedings","url":"http://researchr.org/publication/KatsV10","firstpage":444,"publisher":"ACM","id":"e48132a2-6bc1-416b-a568-dcf0f13a89e4","authors":[{"person":{"id":"6e29bb96-28c9-4c76-915d-160ef1947602","fullname":"Lennart C. L. Kats","key":"lennartclkats","url":"http://researchr.org/profile/lennartclkats"},"alias":{"id":"f6b6789b-a32a-417c-a90e-c37a12f25728","name":"Lennart C. L. Kats","key":"lennart-c.-l.-kats","url":"http://researchr.org/alias/lennart-c.-l.-kats"}},{"person":{"id":"f0fbf7c0-9729-4ec8-b3c9-5f30dbd9614b","fullname":"Eelco Visser","key":"eelcovisser","url":"http://researchr.org/profile/eelcovisser"},"alias":{"id":"f68ba0ee-899e-4c4c-9d8a-6fed5092830a","name":"Eelco Visser","key":"eelco-visser","url":"http://researchr.org/alias/eelco-visser"}}],"title":"The Spoofax language workbench: rules for declarative specification of languages and IDEs","organization":"","address":"Reno/Tahoe, Nevada","month":"","volume":"","year":"2010","conference":"oopsla","note":"","doi":"http://doi.acm.org/10.1145/1869459.1869497","key":"KatsV10"},{"abstract":"Attribute grammars are a powerful specification formalism for tree-based computation, particularly for software language processing. Various extensions have been proposed to abstract over common patterns in attribute grammar specifications. These include various forms of copy rules to support non-local dependencies, collection attributes, and expressing dependencies that are evaluated to a fixed point. Rather than implementing extensions natively in an attribute evaluator, we propose attribute decorators that describe an abstract evaluation mechanism for attributes, making it possible to provide such extensions as part of a library of decorators. Inspired by strategic programming, decorators are specified using generic traversal operators. To demonstrate their effectiveness, we describe how to employ decorators in name, type, and flow analysis. ","conferenceYear":"2009","series":"Lecture Notes in Computer Science","lastpage":157,"booktitle":"Compiler Construction, 18th International Conference, CC 2009, Held as Part of the Joint European Conferences on Theory and Practice of Software, ETAPS 2009, York, UK, March 22-29, 2009. Proceedings","number":"","editors":[{"person":{"id":"5991e76d-b9a7-4b37-b08a-c72d4c05db58","fullname":"Oege de Moor","key":"oegedemoor","url":"http://researchr.org/profile/oegedemoor"},"alias":{"id":"23153e23-c6bd-434a-9197-e5b6c0d878fa","name":"Oege de Moor","key":"oege-de-moor","url":"http://researchr.org/alias/oege-de-moor"}},{"person":{"id":"506c63b4-7861-4301-8905-29b7620b6473","fullname":"Michael I. Schwartzbach","key":"michaelischwartzbach","url":"http://researchr.org/profile/michaelischwartzbach"},"alias":{"id":"55b2c00c-f58d-4303-b161-0f5fbede2eb8","name":"Michael I. Schwartzbach","key":"michael-i.-schwartzbach","url":"http://researchr.org/alias/michael-i.-schwartzbach"}}],"type":"inproceedings","url":"http://researchr.org/publication/KatsSV09","firstpage":142,"publisher":"Springer","id":"fc5d00ce-4f71-4d82-ac2e-56221181deae","authors":[{"person":{"id":"6e29bb96-28c9-4c76-915d-160ef1947602","fullname":"Lennart C. L. Kats","key":"lennartclkats","url":"http://researchr.org/profile/lennartclkats"},"alias":{"id":"f6b6789b-a32a-417c-a90e-c37a12f25728","name":"Lennart C. L. Kats","key":"lennart-c.-l.-kats","url":"http://researchr.org/alias/lennart-c.-l.-kats"}},{"person":{"id":"30f25bf3-1656-4413-9a94-659dd3ba4ded","fullname":"Anthony M. Sloane","key":"anthonymsloane","url":"http://researchr.org/profile/anthonymsloane"},"alias":{"id":"4cebde5d-1a0c-46b4-abdc-cd51b77b3c88","name":"Anthony M. Sloane","key":"anthony-m.-sloane","url":"http://researchr.org/alias/anthony-m.-sloane"}},{"person":{"id":"f0fbf7c0-9729-4ec8-b3c9-5f30dbd9614b","fullname":"Eelco Visser","key":"eelcovisser","url":"http://researchr.org/profile/eelcovisser"},"alias":{"id":"f68ba0ee-899e-4c4c-9d8a-6fed5092830a","name":"Eelco Visser","key":"eelco-visser","url":"http://researchr.org/alias/eelco-visser"}}],"title":"Decorated Attribute Grammars: Attribute Evaluation Meets Strategic Programming","organization":"","address":"","month":"","volume":"5501","year":"2009","conference":"cc","note":"","doi":"http://dx.doi.org/10.1007/978-3-642-00722-4_11","key":"KatsSV09"}],"name":"kats-thesis"}