In this
post I will be reviewing some considerations that I usually have in mind while
designing a DSL.
The
audience
When you
are working on a DSL, the first and most important thing to have in mind is the
audience you are aiming for. It’s gonna be technical people, business
executives, sales people, etc…, etc….
The syntax
If the
audience is not a bunch of techies, here is set of design rules that you
should follow (at least, they've worked out for me):
- The syntax should be as much as closest to the domain terms that the user uses on a daily basis.
- Use sentences like “when something_happen:” instead of “if (somethingHappen){..}”.
- Use logical operators like “and”, “or” instead of “&&”, “||”.
- Don't make your syntax case sensitive.
- snake_case works better than PascalCase.
- When syntax error happen (and it will happen) provide useful messages that lead the user to the right path.
- Try to avoid the use of parentheses as much as you can. (our users are not Lisp programmers ;))
- You are not building a general purpose language. Avoid loops, conditionals and variables as much as you can. Keep your DSL Turing incomplete.
Working with
scripts
- Build a professional script editor (Notepad sucks, big time)
- Use different icons to differentiate conditions from actions.
- Provide an autocomplete mechanism and syntax highlight.
- Don't try to build your own version of VS. It will take a butt load of time, and most of the features you built will never be used.
- Provide a versioning mechanism for scripts.
This is how
it looks the editor provided with the sample app of this post.
The main
component of the editor is a control called “Fast Colored TextBox” created by Pavel Torgashov,
all the credits to this guy, the control is awesome and works like a charm.
How you will go from your DSL syntax to executable code
In this post
I’m working with a technique called “source to source translation”, this means
that I’ll be converting code from our DSL syntax into C# code in order to feed
the Roslyn compiler.
Note: The
code provided with this post does not cover in deep how source to source
translation works nor is a full or complete solution, it’s just going to work
with the example I’m showing and maybe give you a starting point, but
nothing else.
You can get the source code from github using this link
I compile and run your demo application. When I type "when", I don't get the autocomplete menu.
ReplyDeleteIn order to popup the autocompletion list you should hit Ctrl+Space. It' a pretty common shortcut in old editors. (although, it's not that friendly for end users.... my bad on that one ;))
DeleteThis comment has been removed by the author.
ReplyDelete