This paper proposes a fluent API generator for Scala, Haskell, and C++. It receives a grammar definition and generates a code skeleton of the library in the host programming language. The generated library is accessed through a chain of method calls; this style of API is called a fluent API. The library uses the host-language type checker to detect an invalid chain of method calls. Each method call is regarded as a lexical token in the embedded domain specific language implemented by that library. A sequence of the lexical tokens is checked and, if the sequence is not acceptable by the grammar, a type error is reported during compilation time. A contribution of this paper is to present an algorithm for generating the code-skeleton for a fluent API that reports a type error when a chain of method calls to the library does not match the given LR grammar. Our algorithm works in Scala, Haskell, and C++. To encode LR parsing, it uses the method/function overloading available in those languages. It does not need an advanced type system, or exponential compilation time or memory consumption. This paper also presents our implementation of the proposed generator. CCS Concepts: • Software and its engineering → Domain specific languages; Source code generation.
This paper presents a tool named Silverchain, which generates class definitions for a fluent API from the grammar of the API. A fluent API is an API that is used by method chaining and its grammar is a BNF-like set of rules that defines method chains accepted in type checking. Fluent APIs generated by Silverchain provide two styles of APIs: One is for building a chain by concatenating all method calls in series. The other is for building a chain from partial chains by passing child chains to method calls in the parent chain as their arguments. To generate such a fluent API, Silverchain first translates given grammar into a set of deterministic pushdown automata without ϵ-transitions, then encodes these automata into class definitions. Each constructed automata corresponds to a nonterminal in given grammar and recognizes symbol sequences produced from its corresponding nonterminal.
No abstract
Context: Algorithms for generating a safe fluent API have been actively studied in recent years. A safe fluent API is a fluent API that reports incorrect chaining of the API methods as a type error to the API users. Although such a safety property improves the productivity of users, the construction of a safe fluent API is excessively complicated for developers. Therefore, generation algorithms are studied to reduce the development costs of a safe fluent API. Such studies may benefit many programmers, as a fluent API is a popular design in the real world. Inquiry: The generation of a generic fluent API remains unaddressed. A generic fluent API refers to a fluent API that provides generic methods (those that contain type parameters in their definitions). The Stream API in Java is an example of a generic fluent API. Previous studies on safe fluent API generation have focused on the grammar classes that the algorithms can deal with for syntax checking. The key concept of such studies is using nested generics to represent a stack structure for the parser built on top of the type system. Within this context, the role of a type parameter has been limited to the internal representation of a stack element of that parser on the type system. Library developers cannot use type parameters to include a generic method in their API so that the semantic constraints for their API will be statically checked; for example, the type constraint on the items passed through a stream. Approach: We propose an algorithm for generating a generic fluent API. Our translation algorithm is modeled as the construction of deterministic finite automaton (DFA) with type parameter information. Each state of the DFA holds information regarding which type parameters are already bound in that state. This information is used to identify whether a method invocation in a chain newly binds a type to a type parameter or refers to a previously bound type. This identification is necessary because a type parameter in a chain is bound at a particular method invocation, and the bound type is referenced in the following method invocations. Our algorithm constructs the DFA by analyzing the binding times of the type parameters and their propagation among the states in a DFA that is naively constructed using the given grammar. Knowledge: With our algorithm, the generation of a safe fluent API can be introduced into practical use. Grounding: We implemented a generator named Protocool to demonstrate our algorithm. Moreover, we generated several libraries using Protocool to demonstrate the ability and limitations of our algorithm. Importance: Our algorithm can aid library developers to develop a generic fluent API, which is essential for bringing safe fluent API generation to the real world, as the use of type parameters is a common technique in library API design. ACM CCS 2012Software and its engineering → Domain-specific languages; Source code generation;
scite is a Brooklyn-based organization that helps researchers better discover and understand research articles through Smart Citations–citations that display the context of the citation and describe whether the article provides supporting or contrasting evidence. scite is used by students and researchers from around the world and is funded in part by the National Science Foundation and the National Institute on Drug Abuse of the National Institutes of Health.
hi@scite.ai
10624 S. Eastern Ave., Ste. A-614
Henderson, NV 89052, USA
Copyright © 2024 scite LLC. All rights reserved.
Made with 💙 for researchers
Part of the Research Solutions Family.