ANTLR v3 C# Code generator and Runtime library
Kunle Odutola
kunle UNDERSCORE odutola AT hotmail.com
Micheal Jordan
Johannes Luber (Maintainer)
jaluber AT gmx.de
Contents
Status
As of September 2007, the C# code generator and runtime are NOT in sync with the latest release and development versions of the ANTLR tool and Java language target. The last release of the C# code generator and runtime were sync'ed to ANTLR v3.0 release from July 2007. Nevertheless, no major problems have been reported by those using the C# codegen and runtime with ANTLR v3.0.1 since it's release in August 2007.
As of October 2007, the ANTLR source depot contains an early beta of the C# codegen and runtime for the upcoming ANTLR v3.1 release. Starting from the end of October, ANTLR daily builds of v3.1 have been available for those wishing to test the C# support with the new features of ANTLR v3.1. As before, development progress going forwards is likely to be sporadic.
The C# code generation templates and the CLR runtime library are feature complete for both versions. The C# targets leverage the existing C# StringTemplate implementations to support the broadest range of the features that ANTLR provides. The long open issue of unit tests has finally been tackled with the adoption of MbUnit and the inclusion (in the v3.1 version) of a wide range of tests for the runtime library. As before, basic sanity checks will done by ensuring that the sample grammars in the examples-v3 archive works as designed. This is currently a work-in-progess for the v3.1 release.
Architecture
As with all other targets, the C# code generation and runtime are modelled on the Java version. This means the C# target supports features such as grammar development/prototyping and remote debugging with the AntlrWorks GUI which is very important for ANTLR users.
Target Platforms
Microsoft .NET v1.1 and v2.0
Mono
Runtime Location
The compiled libraries are found in the distribution under the directory "runtime/csharp". Intermediary builds may not have the current version and can be compiled by using the build tools.
Supported build tools
Microsoft Visual Studio 2003 and 2005
Nant v0.85
Performance
The V3 target generates code that is easily faster than that generated by the V2 target (especially the lexers). We probably won't be able to match the bare-metal performance of the code generated by Jim Idle's C target or Ric Klaren's C++ target but, we expect to be very competitive with the other targets.
Usage
Generating C# code from a grammar
To specify that the ANTLR tool should generate C# code (rather than the default of generating Java code) for a grammar, set the grammar-level option named language
to the value CSharp
as shown below:
grammar MyGrammar; options { language=CSharp; } // rest of grammar follows ....
Specifying the namespace for your recognizer
You can specify that your generated recognizer should be declared within a specific namespace as shown below. By default all recognizers are generated as top-level types with no enclosing namespace.
@lexer::namespace { My.Custom.NameSpace.For.Lexers } @parser::namespace { My.Custom.NameSpace.For.ParsersExclTreeParsers } @namespace { My.Custom.NameSpace.For.ParsersInclTreeParsers }
Syntactic differences from the Java target
The C# target uses language features like properties as the official coding guidelines which cause the general documentation to differ from what can be really used for the C# target. The rule of thumb is, that the attributes of rules are accessed with a capital letter at the beginning. Nonetheless there are exceptions so the goal is to have a comprehensive overview. If there are any errors, please fix them or send an email to the mailing list.
Java Syntax |
C# Syntax |
Notes |
---|---|---|
text |
Text |
|
start |
Start |
Untested |
stop |
Stop |
Untested |
tree |
tree |
|
st |
st |
|
type |
Type |
Untested |
line |
Line |
Untested |
pos |
Pos |
Untested |
channel |
Channel |
Untested |
$x.size() |
$x.Count |
|
Another problem, you may encounter, is that value types are initialized with null (happens e.g. while using labels). The cause lies in the following definition of CSharp.stg:
csharpTypeInitMap ::= [ "int":"0", "uint":"0", "long":"0", "ulong":"0", "float":"0.0", "double":"0.0", "bool":"false", "byte":"0", "sbyte":"0", "short":"0", "ushort":"0", "char":"char.MinValue", default:"null" // anything other than an atomic type ]
As you can see, only the inbuilt value types are supported. As adding value types to this map is an open-ended task, the maintainer is reluctant to make any changes in that structure. Until a new syntax to overwrite the default value explicitly is introduced, a private build along with the changed map is recommended.
Debugging with ANTLRWorks
The ANTLRWorks tool is written in Java and is only able to debug Java recognizers directly. Nevertheless, you can debug your C# recognizers with ANTLRWorks by using the Remote Debugging feature of ANTLRWorks. In ANTLRWorks, Remote Debugging works by connectiong to a running instance of a debug-instrumented recognizer (generated with the -debug
switch to ANTLR) over the network.
To debug your C# recognizer with ANTLRWorks:
- Generate a debuggable version of your recognizer by specifying the
-debug
option to ANTLR - Create a driver program that creates your recognizer and runs some test input through it (see the examples-v3 archive for sample driver programs)
- Compile your driver and recognizer to produce your executable file(s)
- Execute your driver program (it will launch your recognizer and appear to hang - it's just waiting for ANTLRWorks to connect)
- Start ANTLRWorks (or switch to it if it is already running) and click the menu Debugger|Debug Remote...
- Click Connect to accept the default host and port values (
localhost
and49153
respectively) - ANTLRWorks should now start debugging your recognizer!
Warning
ANTLRWorks remote debugging has only been tested for C# Parsers. TreeParsers and Lexers should work but...