Building Effective External DSLs
What tools are there for me to build a real, honest to goodness external DSL. And no, I'm not talking about abusing Ruby, Boo, XML or another existing language or syntax, I mean a REAL external DSL -- my own language for my own purposes.
I know that there are a few language workbenches being developed and I've heard about things like "Irony" for .NET. And, of course, there's ANTLR, Lex/Yaac, etc but I'm afraid those are too complicated for what I'm trying to do.
Please talk about a DSL builder tool you may have used or heard about and your impressions on how it helps and what its downsides are.
I've written DSLs in Boo, Irony.NET and a toolkit called Grammatica. You say that a parser-generator is too complicated, but you may be being too hasty in your judgment, in fact they are quite simple to use once you get over a small learning curve, and open up a vast world of possibility that easily overrides the effort. I found learning the notation required to write grammars for most parser generators somewhat similar to learning Regular Expressions - you have to bend your mind just slightly to let them in, but the rewards are significant.
My opinion is this: If your target language is simple enough that it could be handled by a dumbed down visual designer, then writing a grammar for it using a parser generator should be quite easy.
If your target DSL is complicated enough that you'll need to break a sweat writing a grammar, then the dumbed down visual tool won't cut the mustard anyway and you'll end up having to learn to write a grammar anyway.
I agree in the long term about internal vs external DSL's, though. I wrote an internal DSL in Boo and had to modify my DSL syntax to make it work, and it always felt like a hack. The same grammar using Irony.NET or ANTLR would have been just as easy to accomplish with more flexibility.
I have a blog post discussing some options. The post is centered around writing a DSL for runtime expression evaluation, but the tools are all the same.
My experience with Irony.NET has been all positive, and there are several reference language implemented using it, which is a good place to start. If your language is simple, it is absolutely not complicated to get up and running. There is also a library on CodeProject called TinyParser - this one is really interesting, because it generates the parser as pure source code, which means your final product is completely free of any third party reference. I haven't used it myself, though.
- → Adding scripting functionality to .NET applications
- → Learning to write a compiler
- → C# Compiler Incorrectly Optimizes Code
- → More difficult to build: Emulator or compiler?
- → adding manifest to jar file while compiling with maven2
- → .Net 2+: why does if( 1 == null ) no longer throw a compiler exception?
- → Why does a C/C++ program often have optimization turned off in debug mode?
- → Why doesn't anyone upgrade their C compiler with advanced features?
- → How can I see in what [Java/Scala?] code does Scala compiler rewrites original Scala-code
- → Why is (void) 0 a no operation in C and C++?
- → What is a good way of working with variables in 8 bit blocks?
- → How does GCC/Clang buffer preprocessed code?
- → How does casting from integers to floating-point numbers work?