Click here to Skip to main content
15,890,579 members
Articles / Web Development / ASP.NET
Article

GBVB - Converting VB.NET code to C#

Rate me:
Please Sign up or sign in to vote.
2.38/5 (95 votes)
27 Apr 200310 min read 557.2K   17.2K   95   104
A tool and a method for VB.NET to C# source code conversion

GBVB - Converting VB.NET code to C#

“GBVB (Goodbye VB) is an amazing tool that flawlessly converts any portion of VB.NET code to C# code in a fraction of seconds.” I would love to be able to say this. If you are looking for such a tool, forget about it. You will not be able to find it, and I will explain why later in this article.

Why convert?

Isn’t .NET all about language interoperability? Why would someone ever need to convert VB.NET code to C#? Well, even though the languages are fully interoperable, there are some good reasons for this conversion:

  1. The VB.NET code is still not strongly type-checked. It still makes some type conversions that may be dangerous. Try this code, with Option Strict On, for an example (both are true):
    VB.NET
    Dim x As String
    If x Is Nothing Then
        Console.WriteLine("X is Nothing")
    End If
    If x = "" Then
        Console.WriteLine("X is an empty string")
    End If
    
  2. Most C# programmers find VB.NET syntax ugly and cumbersome. I know this is a matter of personal taste, but it is a good reason for code migration. If you do not feel comfortable using a language, it may be better learn to either love it, or get rid of it.
  3. C# features several compile-time code checking, besides strong typing. Access uninitialized variable, assign values to a variable and never user it, or declare a variable and do not use it, create unreachable code, and you will get an error or a warning from the compiler. VB.NET silently compiles this kind of code.
  4. Since it is easier writing a C# parser (I will write about this later in this article), there are and there will always be more for C# code analyzing and rewriting, while VB.NET will receive much less attention in this area.
  5. Because of some VB.NET ambiguities, sometimes VB.NET code can be slower than the C# equivalent.

Not Possible to Write a Perfect VB.NET to C# Converter

It is not possible to write such a perfect tool because VB.NET syntax allows a programmer to write ambiguous code. VB.NET syntax ambiguities follow in two categories:

  • A parser needs type information for disambiguation, e.g., when you see the code ambiguous(3), you need type information to know if this is a function call or an array access. When translating to C#, you’ll need to either use ambiguous(3) or ambiguous[3]. Actually, this does not make it impossible to write such a tool, but it makes it harder.
  • Some code using the Object data type can only be disambiguated at runtime, e.g., ambiguous(3) will only be resolved on runtime. Actually, it can change from one call to other. This kind of code is impossible to translate. One could use some heuristics to determine the runtime data type at parsing time, but it would be hard and yet not 100% effective.

Approaches for Code Conversion

  • Anakrino! Well, this is a reasonable idea, until you really try it. Just a tip: do you know the VB compiler does not put your comments on the final assembly? There are funnier things, too, but I will let you discover them by yourself.
  • Regular expressions. Come on, you can come up with something better than this. Again, a tip: try to write a recursive regular expression.
  • Write a parser. That is what I did. It is not so much work as it appears, if you keep yourself writing a simplified LL(1) grammar and if you use a nice tool, such as COCO/R for C#.
  • Do everything by hand. I have done that, and I can tell you: GBVB will prevent RSI like no other tool.

Goals and Restrictions

With the previous knowledge in mind, I decided to make a tool that converts some “well-behaved” VB.NET code to C#. Let us define some goals for GBVB, sorted by priority:

  1. Garbage in, Garbage out: if you give the converter some garbage code, you will have more garbage.
  2. This is a typing-saving tool: GBVB will do repeatable most hard and repeatable work, but you still will need to do “brains” part. Some code will not be translated and sometimes you will get an error on the output: if needed, comment the affected code. The converted code does not even need to compile, but it should be faithful to the original VB.NET code.
  3. It should be very useful for converting my own code: if it is useful for you too, hey, it is your lucky day! Nah, I am just joking: actually, GBVB could translate nearly 90% of my code, so you will be very unlucky if GBVB do not for you.
  4. This should be an easy-to-code tool. Fast to code, too. As such, I hope you do not find that my coding style produces excessive commenting on the source code at a point that makes it hard to read.
  5. This is not a pretty printer (it is more like an ugly printer): it does generate indented code, but it does not generate highly organized code. By goal #2, it is up to you to organize it as you wish. Pressing Ctrl-K F on the generated code sometimes helps.
  6. I explicitly decided not to use heuristics, because of goal #2 and #4.
  7. No VB runtime functions will be converted to the .NET Framework “equivalent” ones, e.g., Mid(x) will not be converted to x.Substring. Although easy, as I show you later, this would introduce several bugs and would need revision anyway, without the compiler errors to help you. Don’t you believe me? Run this code, just for fun:
    VB.NET
    Dim x As String
    If x Is Nothing Then
        Console.WriteLine("X is Nothing")
    End If
    If x = "" Then
        Console.WriteLine("X is an empty string")
    End If
    If Mid(x, 1, 1) = "" Then
        Console.WriteLine("Mid X is an empty string")
    End If
    If Len(x) = 0 Then
        Console.WriteLine("Len(X) == 0")
    End If
    Console.WriteLine(x.Substring(0, 1))
    
  8. On Error Goto / On Error Resume Next will only be part of GBVB over my dead body. See Goal #1.
  9. The Goto Statement: See Goal #8.
  10. The REM is an abomination used only by some distorted minds. There is the one char line commenting, did you know?
  11. Most array code will have trouble while being translated.
  12. Some VB.NET syntax keywords and features are not supported, like Handles, inline array declarations. Goals #2, #3, #4, and pure laziness.
  13. I made it using Visual Studio .NET 2003. I do not even have Visual Studio .NET 2002 on my machine anymore.

Using the tool

Image 1

Look at the screen shot: if you cannot figure out by yourself how to run and use this tool, you should not be programming. Try something easier, there may be some exciting jobs for you on the food market. Alternatively, keep with VB.

Converting from VB6 code

A direct conversion is sometimes possible, but the VB Upgrade Wizard will do a much better job. Therefore, I do strongly recommend you to upgrade the code to VB.NET, run it, test it, fix it, and only then convert it to C# code.

Some advices before migrating

  • Only migrate solid, working code. Create a rigorous unit testing set (you already have this, right?) and only then migrate your code. This way, you can be sure your code runs the way it is supposed to run.
  • You will need to change some things before migrating, because some features are not support by either C# or GBVB. While still working on the VB.NET code, I recommend you to change the following things:
    • Get rid of your optional parameters.
    • Use Option Strict On and Option Compare Binary.
    • Classic On Error error handling is not supported in C#. Change this code to exception handling.
    • Modules are not supported, but Friend classes that have only Shared methods can easily substitute them. Bear in mind that often code on Modules have global variables and is not thread safe, especially if migrated from VB6 (VB6 code ran in STA, so it was not susceptible to this kind of problem), so you can see this as a good opportunity to break it in smaller classes.
    • Change Select Case with conditions and exception filters, if you use them.
    • Finally, remove all the VB runtime functions and use only the .NET framework equivalent ones. Do you remember the VB.NET weirdness I mentioned? Well, having a sound unit testing set will ease things to you.
    • If GBVB has trouble to migrate some statement, comment it, and migrate it manually. You will notice the trouble because GBVB will often stop the code migration on a specific statement.
    • After migrating, do some code cleaning. Normally, C# will give you hundreds of healthy warnings about your “perfect” VB.NET.

Improvements

  • It could be an add-in for VS.NET. For now, I recommend you to add it to the Tools menu.
  • GBVB is only able to migrate “full” code files. Code snippets do not migrate nicely.
  • Do not complain of my commenting style, I know that so many comments like I did can make the code hard to read! Besides this, there is a mix of Portuguese and English words on the identifiers, which makes looking at the sources a rather “globalized” experience. But, if you are experienced with COCO/R, the code is plain obvious and easy to follow.
  • GBVB do not support the “one line” If Then, nor multiple statements on the same line.
  • Remove the LL(1) warnings, and the “Not Expression” annoying messages.
  • Create an option for the brace position. It is easy to change the Util.OpenBlock and the Util.CloseBlock methods for this.
  • It is very easy to add some automatic translation of VB.NET runtime functions if you like to live in danger. In a future version, this will be implemented as optional features. On the VBNET.ATG file, change the Expression compiler production and add specific translation for your code. Like the sample below, where I convert a Len(expression) to Expression.Length (if you didn’t use it before, see the power of COCO/R!):
    Expression<out string exp> =
    (
        "Len"
        ParentExp<out exp>    (.  exp += ".Length"; .)
        |
        "True"                (.  exp = "true"; .)
        |
    

Acknowledgments

This tool was only possible because of the C# version of COCO/R, by Hanspeter Moessenboeck.

I used the version modified by Pat Terry, available here.

Actually, I slightly changed the version, because all the parsers I write need to be thread safe and deal with accented chars. This specific parser needed also a delegate on the commenting parser, because COCO/R by default ignores comments, which is a good thing, but not in this case. Therefore, everything that is working ok has to be credited to Pat & Hanspeter, and every bug may have been introduced by me.

I did not put my COCO/R changed sources on the ZIP files because I cannot assure you if my modified version is fully compatible with the original, only that it suits my needs. If you are interested on the sources, mail me and I will send you.

License

You can use all the code wrote by me in this article (everything but COCO/R, which is subject to its own licensing) and distribute it freely, as soon as you keep the Copyright notice. If you create some derived work, put a link back to this article, citing me as the author of the original work, as I have did on the Acknowledgments section. You cannot sell nor license this code without my written authorization, but you can make sell or license the code you converted using it.

The Standard Disclaimer

As I said before, I tested this on my machine and it works fine. Use it at your own risk: if you use it, you can lose data, profit, have hardware problems, cause radioactive contamination and start a nuclear world war. However, for me, it works fine and never had such a problem.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
CEO
Brazil Brazil
I develop software since I was 11. In the past 20 years, I developed software and used very different machines and languages, since Z80 based ones (ZX81, MSX) to mainframe computers. I still have passion for ASM, though no use for it anymore.
Professionally, I developed systems for managing very large databases, mainly on Sybase and SQL Server. Most of the solutions I write are for the financial market, focused on credit systems.
To date, I learned about 20 computer languages. As the moment, I'm in love with C# and the .NET framework, although I only can say I’m very proficient at C#, VB.NET(I’m not proud of this), T/SQL, C++ and libraries like ATL and STL.
I hate doing user interfaces, whether Web based or not, and I’m quite good at doing server side work and reusable components.
I’m the technical architect and one of the authors of Crivo, the most successful automated credit and risk assessment system available in Brazil.

Comments and Discussions

 
GeneralRe: this not work Pin
Andy *M*11-Jun-07 0:04
Andy *M*11-Jun-07 0:04 
GeneralRe: this not work Pin
Destiny7774-Nov-08 15:09
Destiny7774-Nov-08 15:09 
GeneralDoes it work at all Pin
Darthcoder29-Sep-05 21:32
Darthcoder29-Sep-05 21:32 
GeneralDid no convert even the Msg( x ) to Message Pin
somebody_tr30-Aug-05 11:58
somebody_tr30-Aug-05 11:58 
GeneralDoes not work. Pin
CDBuffet8-Dec-04 8:08
CDBuffet8-Dec-04 8:08 
GeneralRe: Does not work. Pin
Dave Doknjas6-Jan-05 5:59
Dave Doknjas6-Jan-05 5:59 
GeneralCould not compile Pin
RonBurd15-Apr-04 10:15
RonBurd15-Apr-04 10:15 
GeneralMy Hacks Pin
OmegaSupreme13-Apr-04 6:52
OmegaSupreme13-Apr-04 6:52 
I've modified the VBNET.ATG file and the Util.cs as I've been using GBVB. I've not documented the changes or anything but I provide them here in case they are of use to anyone else.

There's slightly better handling of Arrays, AddHandler statements and one or two other tweaks.

VBNET.ATG

using GBVB;<br />
<br />
COMPILER VBNET<br />
<br />
public Util util;<br />
<br />
CHARACTERS<br />
<br />
digit = "0123456789".<br />
letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".<br />
cr = "\r".<br />
lf = "\n".<br />
crlf = cr+lf.<br />
space = " \t".<br />
anyclose = ANY - "]".<br />
stringChars = ANY - "\"".<br />
<br />
TOKENS<br />
<br />
number = digit { digit } [ "." digit { digit } ].<br />
quotedString = "\"" { stringChars | "\"\"" } "\"".<br />
identifier = (letter | "_") { letter | "_" | "." | digit }.<br />
IGNORE space + crlf + "_"<br />
COMMENTS FROM "'" TO cr<br />
<br />
PRODUCTIONS<br />
<br />
VBNET =                                                 <br />
{ OptionStmt }<br />
{ ImportStmt }<br />
[ AttributeList ] br />
ClassStmt<br />
.<br />
<br />
ClassStmt<br />
=<br />
ClassGroup {<br />
    ClassGroup<br />
}<br />
                                                (.<br />
                                                    util.Writeline("");<br />
                                                    util.WriteDelegates();<br />
                                                .)<br />
.<br />
<br />
ClassGroup<br />
=<br />
                                                (.    <br />
                                                    string modifier = "";<br />
                                                .)<br />
[ ModifierGroup<out modifier> ] br />
TypeDeclaration<modifier><br />
.<br />
<br />
ModifierGroup<out string modgroup>                (.    <br />
                                                    string modifier;<br />
                                                    modgroup = ""; .)<br />
=<br />
Modifier<out modifier>                            (.    modgroup += modifier;<br />
														modgroup += " "; <br />
													 .)<br />
{<br />
Modifier<out modifier>                            (.    modgroup += modifier; <br />
														modgroup += " "; <br />
														.)<br />
}<br />
.<br />
<br />
ImportStmt =                                    (. string nmspc; .)<br />
"Imports"<br />
QualName<out nmspc>                                (. util.Writeline("using " + nmspc + ";"); .)<br />
.<br />
<br />
OptionStmt =<br />
"Option"<br />
(<br />
"Explicit" ["On" | "Off"]<br />
|<br />
"Strict" ["On" | "Off"]<br />
|<br />
"Compare" ["Text" | "Binary"]<br />
)<br />
.<br />
<br />
InheritanceDecl<out string decl> =<br />
                                                    (.    string typename; .)<br />
"Inherits"<br />
QualName<out typename>                                (. decl = " : " + typename; .)<br />
.<br />
<br />
ImplementsDecl<ref string decl> =<br />
                                                    (.    string typename; .)<br />
"Implements"<br />
QualName<out typename>                                (.<br />
                                                        if (decl == "")<br />
                                                            decl = " : " + typename;<br />
                                                        else<br />
                                                            decl += ", " + typename;<br />
                                                    .)<br />
    {<br />
        ","<br />
        QualName<out typename>                        (.<br />
                                                        decl += ", " + typename;<br />
                                                    .)<br />
    }<br />
.<br />
<br />
TypeDeclaration<string modifier><br />
=<br />
                                                (.<br />
                                                    string bases = "";<br />
                                                    string decl = modifier;<br />
                                                    string typename;<br />
                                                 .)<br />
(<br />
"Class"                                        (.    decl += "class "; .)<br />
| "Structure"                                    (.    decl += "struct "; .)<br />
)<br />
QualName<out typename>                            <br />
                                                (.    <br />
                                                    decl += typename;<br />
                                                    util.PushClassName(typename);<br />
                                                .)<br />
[<br />
InheritanceDecl<out bases><br />
]<br />
[<br />
ImplementsDecl<ref bases><br />
]                                                (.    decl += bases; .)<br />
                                                (.<br />
                                                    util.Writeline(decl);<br />
                                                    util.OpenBlock();<br />
                                                .)<br />
{ MemberDeclaration }<br />
"End" ("Class" | "Module")                        (.<br />
                                                    util.CloseBlock();<br />
                                                    util.PopClassName();<br />
                                                .)<br />
.<br />
<br />
ArithOp<out string op> =<br />
                                                (. op = ""; .)<br />
(<br />
("+=" | "-=" | "+" | "-" | "*" | "/" )          (. op = token.val; .)<br />
| "\\"                                            (. op = "/"; .)<br />
| "Mod"                                            (. op = "%"; .)<br />
| "&"                                            (. op = "+"; .)<br />
| "Not"                                            (. op = "!"; .)			<br />
| BoolOp<out op><br />
| LogicalOp<out op><br />
)<br />
.<br />
<br />
ArithExpr<out string exp> =<br />
                                                (. string op, exp2; .)<br />
ArithOp<out op><br />
Expression<out exp2>                            (. exp = op + " " + exp2; .)<br />
.<br />
<br />
TypeOfExp<out string exp> =<br />
                                                (.    string exp2, typespec; .)<br />
"TypeOf"<br />
QualName<out exp2><br />
"Is"<br />
QualName<out typespec>                            (.    exp = exp2 + " is " + typespec; .)<br />
.<br />
<br />
CTypeExp<out string exp> =<br />
                                (.<br />
                                    string exp2, typespec, exp3;<br />
                                .)<br />
"CType"<br />
"("<br />
Expression<out exp2><br />
","<br />
QualName<out typespec><br />
[<br />
    "("                                    (. typespec += "["; .)<br />
    ExpressionList<out exp3>            (. typespec += exp3; .)<br />
    ")"                                    (. typespec += "]"; .)<br />
]<br />
")"<br />
                                (.<br />
                                    exp = "((" + typespec + ")" + exp2 + ")";<br />
                                .)<br />
.<br />
CObjExp<out string exp> =<br />
                                (.<br />
                                    string exp2;<br />
                                .)<br />
"CObj"<br />
"("<br />
Expression<out exp2><br />
")"<br />
                                (.<br />
                                    exp = "((object)" + exp2 + ")";<br />
                                .)<br />
.<br />
<br />
ParentExp<out string exp> =<br />
                                                (.    <br />
                                                    string exp2;<br />
                                                .)<br />
"("                        <br />
Expression<out exp2><br />
")"                                                (.    exp = "(" + exp2 + ")"; .)<br />
.<br />
<br />
Expression<out string exp> =<br />
                                                (.    <br />
                                                    string parms = "";<br />
                                                    string typename;<br />
                                                    string exp2 = "";<br />
                                                    exp = "";<br />
                                                 .)<br />
(<br />
"True"                                            (.    exp = "true"; .)<br />
|<br />
"False"                                            (.    exp = "false"; .)<br />
|<br />
"Nothing"                                        (.    exp = "null"; .)<br />
|<br />
"Me"                                            (.    exp = "this"; .)<br />
|<br />
"MyBase"                                        (.    exp = "base"; .)<br />
|<br />
TypeOfExp<out exp><br />
<br />
|<br />
CTypeExp<out exp><br />
|<br />
CObjExp<out exp><br />
|<br />
NumericConstant<out exp><br />
|<br />
StringConstant<out exp><br />
|<br />
ParentExp<out exp><br />
|<br />
QualName<out exp><br />
[<br />
(<br />
"Is" "Nothing"                                    (.    exp += " == null"; .)<br />
|<br />
Callparms<out parms>                            (.    exp += parms; .)<br />
[<br />
"."<br />
Expression<out exp2>                            (.    exp += "." + exp2; .)<br />
]<br />
)<br />
]<br />
|<br />
"New"<br />
QualName<out typename><br />
[<br />
    Callparms<out parms>                        <br />
]                                                (.    <br />
													if (parms == null || parms == "")<br />
													parms = "()";<br />
													exp = "new " + typename + parms; <br />
													<br />
												 .)<br />
)<br />
[<br />
    ArithExpr<out exp2>                                (.    exp += exp2; .)<br />
]<br />
.<br />
<br />
LogicalOp<out string op><br />
=<br />
("=" | "<" | ">" | ">=" | "<=" | "<>")            (.    op = util.ConverteLogicalOp(token.val); .)<br />
.<br />
<br />
BoolOp<out string op><br />
=<br />
                                                (.    op = ""; .)<br />
(<br />
"And"                                            (.    op = " && "; .)<br />
|<br />
"AndAlso"                                        (.    op = " && "; .)<br />
|<br />
"Or"                                            (.    op = " || "; .)<br />
|<br />
"OrElse"                                        (.    op = " || "; .)<br />
)<br />
.<br />
<br />
NumericConstant<out string exp> =<br />
number                                            (.    exp = token.val; .)<br />
.<br />
<br />
StringConstant<out string exp> =<br />
quotedString                                    (.    exp = util.ConverteString(token.val); .)<br />
.<br />
<br />
ExpressionList<out string expList> =<br />
                                                (.    string exp; .)<br />
Expression<out exp>                                (.    expList = exp; .)<br />
{<br />
","                                            (.    expList += token.val + ""; .)<br />
Expression<out exp>                            (.    expList += exp; .)<br />
}<br />
.<br />
<br />
Callparms<out string parms> =<br />
                                        (. string expList; .)<br />
"("                                        (. parms = token.val; .)<br />
[<br />
ExpressionList<out expList>                (. parms += expList; .)<br />
]<br />
")"                                        (. parms += token.val; .)<br />
[<br />
    "("                                    (. parms += "["; .)<br />
    ExpressionList<out expList>            (. parms += expList; .)<br />
    ")"                                    (. parms += "]"; .)<br />
]<br />
.<br />
<br />
AttribSpec<out string attspec> =<br />
                                        (.    <br />
                                            string pl;<br />
                                            string typename;<br />
                                        .)<br />
QualName<out typename>                    (.    attspec = typename; .)<br />
[<br />
Callparms<out pl>                        (.    attspec += pl; .)<br />
]<br />
.<br />
<br />
AttributeList =<br />
                                        (.    string attlist;    <br />
                                            string attspec;<br />
                                        .)<br />
"<"<br />
AttribSpec<out attlist><br />
{<br />
","                                        (.    attlist += token.val; .)<br />
AttribSpec<out attspec>                    (.    attlist += attspec; .)<br />
}<br />
">"<br />
                                        (.<br />
                                            util.Writeline("[" + attlist + "]");<br />
                                        .)<br />
.<br />
<br />
Modifier<out string modifier> =<br />
("Public" | "Private" | "Protected" | "Overrides" | "Shared" | "Friend" | "WithEvents" | "Overloads" | "Shadows" | "ReadOnly")<br />
                                        (.<br />
                                            modifier = util.ConvertModifier(token.val);<br />
                                        .)<br />
.<br />
<br />
MemberDeclaration =<br />
                                                (.<br />
                                                    string modifier = "";<br />
                                                .)<br />
[ AttributeList ] br />
[ ModifierGroup<out modifier> ] br />
(<br />
InterfaceDeclaration<modifier><br />
|<br />
TypeDeclaration<modifier><br />
|<br />
EventDeclaration<modifier><br />
|<br />
EnumDeclaration<modifier><br />
|<br />
PropertyDeclaration<modifier><br />
|<br />
SubDeclaration<modifier><br />
|<br />
FunctionDeclaration<modifier><br />
|<br />
ConstDeclaration<modifier><br />
|<br />
FieldDeclaration<modifier><br />
|<br />
BeginRegion<br />
|<br />
EndRegion<br />
).<br />
<br />
InterfaceDeclaration<string modifier><br />
=<br />
"Interface"<br />
identifier                                        (.<br />
                                                    util.Writeline(modifier + "interface " + token.val);<br />
                                                    util.OpenBlock();<br />
                                                .)<br />
{<br />
    SubHeader<""> | FunctionHeader<""><br />
}<br />
"End" "Interface"                                (.    util.CloseBlock(); .)<br />
.<br />
<br />
<br />
EnumDeclaration<string modifier><br />
=<br />
                                    (.    <br />
                                        string constName;<br />
                                        string constValue;<br />
                                    .)<br />
"Enum"                        <br />
identifier                            (.<br />
                                        util.Writeline(modifier + " enum " + token.val);<br />
                                        util.OpenBlock();<br />
                                    .)<br />
{<br />
    identifier                        (.    constName = token.val; constValue = null; .)<br />
    [ "="<br />
      Expression<out constValue><br />
    ]                                (.<br />
                                        if (constValue == null)<br />
                                            util.Writeline(constName);<br />
                                        else<br />
                                            util.Writeline(constName + " = " + constValue);<br />
                                    .)<br />
}<br />
"End" "Enum"                        (.    util.CloseBlock(); .)<br />
.<br />
<br />
BeginRegion =<br />
"#Region"<br />
quotedString                                    (.    util.Writeline("#region " + token.val); .)<br />
.<br />
<br />
EndRegion =<br />
"#End"<br />
"Region"                                        (.    <br />
                                                    util.Writeline("#endregion");<br />
                                                    util.Writeline("");<br />
                                                .)<br />
.<br />
<br />
ConstDeclaration<string modifier> =                (. string decl; .)<br />
"Const"<br />
VarDeclaration<out decl>                        (. util.Writeline(modifier + "const " + decl + ";"); .)<br />
.<br />
<br />
FieldDeclaration<string modifier> =                (. string decl; .)<br />
VarDeclaration<out decl>                        (. util.Writeline(modifier + decl + ";"); .)<br />
.<br />
<br />
QualName<out string typename> =<br />
identifier                        (. typename = util.ConverteTipo(token.val); .)<br />
.<br />
<br />
DeclQualName<out string typename> =<br />
identifier                        (. typename = util.ConverteTipo(token.val); .)<br />
[<br />
    "("<br />
    ")"                            (. typename += "[]"; .)<br />
]<br />
.<br />
<br />
<br />
<br />
VarDeclaration<out string declaration> =<br />
                                (. string typename;<br />
                                   string varname;<br />
                                   string exp;<br />
                                   string dimensions = null;<br />
                                   bool bIsArray = false;<br />
                                   string parms = "";<br />
                                   declaration = "";<br />
                                .)<br />
QualName<out varname><br />
[<br />
"("<br />
    ExpressionList<out dimensions><br />
")"                                (. bIsArray = true; .)<br />
]<br />
"As"<br />
(<br />
"New"<br />
QualName<out typename>            <br />
[<br />
    Callparms<out parms><br />
]                                (.<br />
									if (parms == "" ) parms = "()";<br />
                                    declaration = typename + " " + varname + " = new " + typename + parms;<br />
                                .)<br />
|<br />
QualName<out typename>            (.<br />
                                    if (!bIsArray)<br />
                                        declaration = typename + " " + varname;<br />
                                    else {<br />
                                        declaration = String.Format("{0}[{1}] {2}", typename, dimensions,  varname);<br />
                                        //if (dimensions != null)<br />
                                        //    declaration += String.Format(" = new {0}[{1}]", typename, dimensions);<br />
                                    }<br />
                                .)<br />
)<br />
[<br />
"="<br />
Expression<out exp>                (.    declaration += " = " + exp; .)<br />
]<br />
.<br />
<br />
SubImplementsInterface =<br />
                                (.<br />
                                    string lixo;<br />
                                .)<br />
"Implements"<br />
QualName<out lixo><br />
.<br />
<br />
Handles =<br />
                                (.<br />
                                    string lixo;<br />
                                .)<br />
"Handles"<br />
QualName<out lixo><br />
.<br />
<br />
BaseNewStmt<out string exp>=<br />
                                    (.<br />
                                        string parms = "";<br />
                                    .)<br />
"MyBase.New"                    <br />
"("<br />
[<br />
ExpressionList<out parms><br />
]<br />
")"<br />
                                    (.<br />
                                        exp = "base(" + parms + ")";<br />
                                    .)<br />
.<br />
<br />
MeNewStmt<out string exp>=<br />
                                    (.<br />
                                        string parms = "";<br />
                                    .)<br />
"Me.New"                    <br />
"("<br />
[<br />
ExpressionList<out parms><br />
]<br />
")"<br />
                                (.<br />
                                    exp = "this(" + parms + ")";<br />
                                .)<br />
.<br />
<br />
CtorStmt<ref string exp>=<br />
BaseNewStmt<out exp><br />
|<br />
MeNewStmt<out exp><br />
.<br />
<br />
CtorGroup<ref string exp>=<br />
                                (.<br />
                                    string exp2 = "";<br />
                                .)<br />
CtorStmt<ref exp> <br />
{<br />
    CtorStmt<ref exp2>            (.<br />
                                    exp += ", ";<br />
                                    exp += exp2;<br />
                                .)<br />
}<br />
.<br />
<br />
SubHeader<string modifier> =<br />
                                (.<br />
                                    string decl = modifier;<br />
                                    string paramList;<br />
                                    string bases = "";<br />
                                .)<br />
"Sub"                            <br />
("New"                            (.     decl += " " + util.GetClassName(); .)<br />
| identifier                    (.     decl += "void " + token.val; .))<br />
[<br />
ParameterList<out paramList>    (. decl += paramList; .)<br />
]<br />
[        <br />
    CtorGroup<ref bases>        (.<br />
                                    if (bases != "")<br />
                                        decl += " : " + bases;<br />
                                .)<br />
] br />
                                (.<br />
                                    if (modifier == "") // In interface declaration?<br />
                                        util.Writeline(decl + ";");<br />
                                    else<br />
                                        util.Writeline(decl);<br />
                                .)<br />
[SubImplementsInterface]<br />
[Handles]<br />
.<br />
<br />
<br />
SubDeclaration<string modifier> =<br />
SubHeader<modifier>    (. util.OpenBlock(); .)<br />
[RoutineBody]<br />
"End" "Sub"                        (. util.CloseBlock(); .)<br />
.<br />
<br />
EventDeclaration<string modifier> =<br />
                                (.<br />
                                    string decl = modifier;<br />
                                    string paramList = "";<br />
                                    string evtname = "";<br />
                                .)<br />
"Event"                            (.    decl += "event "; .)<br />
identifier                        (.    evtname = token.val; .)<br />
ParameterList<out paramList>    (.<br />
                                    decl += util.GetEvtHandlerName(paramList) + " " + evtname;<br />
<br />
                                    util.Writeline(decl + ";");<br />
                                .)<br />
.<br />
<br />
RaiseEventStmt =<br />
                                (.<br />
                                    string paramList = "";<br />
                                    string evtname = "";<br />
                                .)<br />
"RaiseEvent"<br />
identifier                        (.    evtname = token.val; .)<br />
"("<br />
ExpressionList<out paramList>    <br />
")"<br />
                                (.<br />
                                    util.Writeline("if (" + evtname + " != null)");<br />
                                    util.OpenBlock();    <br />
                                    util.Writeline(evtname + "(" + paramList + ");");<br />
                                    util.CloseBlock();<br />
                                .)<br />
.<br />
AddHandler = <br />
								(.<br />
                                    string exp, exp2, typespec, exp3;<br />
                                .)<br />
"AddHandler"<br />
Expression<out exp2><br />
","<br />
"AddressOf"<br />
Expression<out typespec><br />
								(. exp = exp2 + "+= new Eventhandler(" + typespec + ");"; <br />
									util.Writeline(exp);<br />
								.)<br />
					<br />
.<br />
PropertyHeader<string modifier> =<br />
                                (.    string funcName;<br />
                                    string paramList = "";<br />
                                    string returnType;<br />
                                .)<br />
"Property"<br />
identifier                        (. funcName = token.val; .)<br />
[ ParameterList<out paramList> ] br />
"As"<br />
DeclQualName<out returnType>    (.<br />
                                    util.Writeline(modifier + " " + returnType + " " + funcName);<br />
                                .)<br />
.<br />
<br />
<br />
PropertyGet =<br />
"Get"                            (.<br />
                                    util.Writeline("get");<br />
                                    util.OpenBlock();<br />
                                .)<br />
[RoutineBody]<br />
"End" "Get"                        (. util.CloseBlock(); .)<br />
.<br />
<br />
PropertySet =                    (.    string paramList = ""; .)<br />
"Set"<br />
[<br />
ParameterList<out paramList>    <br />
]<br />
                                (.<br />
                                    util.Writeline("set");<br />
                                    util.OpenBlock();<br />
                                .)<br />
[RoutineBody]<br />
"End" "Set"                        (. util.CloseBlock(); .)<br />
.<br />
<br />
PropertyDeclaration<string modifier> =<br />
PropertyHeader<modifier>        (. util.OpenBlock(); .)<br />
PropertyBody<br />
"End" "Property"                (. util.CloseBlock(); .)<br />
.<br />
<br />
PropertyBody =<br />
PropertyStmt { PropertyStmt }<br />
.<br />
<br />
PropertyStmt =<br />
PropertyGet<br />
|<br />
PropertySet<br />
.<br />
<br />
FunctionHeader<string modifier> =<br />
                                (.    string funcName;<br />
                                    string paramList = "";<br />
                                    string returnType;<br />
                                .)<br />
"Function"<br />
identifier                        (. funcName = token.val; .)<br />
[ ParameterList<out paramList> ] br />
"As"<br />
DeclQualName<out returnType>    (.<br />
                                    util.Writeline(modifier + returnType + " " + funcName + paramList);<br />
                                .)<br />
[SubImplementsInterface]<br />
[Handles]<br />
.<br />
<br />
FunctionDeclaration<string modifier> =<br />
FunctionHeader<modifier>        (.    util.OpenBlock(); .)<br />
[RoutineBody]<br />
"End" "Function"                (.    util.CloseBlock(); .)<br />
.<br />
<br />
RoutineBody =<br />
RoutineStmt { RoutineStmt }.<br />
<br />
RoutineStmt =<br />
AssignCall<br />
|<br />
SyncLockStmt<br />
|<br />
ThrowStmt<br />
|<br />
DoWhileStmt<br />
|<br />
ExitStmt<br />
|<br />
WhileStmt<br />
|<br />
CallStmt<br />
|<br />
SelectCase<br />
|<br />
ForStmt<br />
|<br />
IfStmt<br />
|<br />
TryCatch<br />
|<br />
ReturnStmt<br />
|<br />
LocalDeclaration<br />
|<br />
RaiseEventStmt<br />
|<br />
AddHandler<br />
.<br />
<br />
SyncLockStmt =<br />
                                (.    string exp; .)<br />
"SyncLock"<br />
Expression<out exp>                (.    <br />
                                    util.Writeline("lock (" + exp + ")");<br />
                                    util.OpenBlock();<br />
                                .)<br />
[RoutineBody]<br />
"End" "SyncLock"                (.    util.CloseBlock(); .)<br />
.<br />
<br />
ThrowStmt =<br />
                                (.    string exp; .)<br />
"Throw"<br />
Expression<out exp>                (.    util.Writeline("throw " + exp + ";"); .)<br />
.<br />
<br />
DoWhileStmt =<br />
                                        (.    string exp; .)<br />
"Do"<br />
(<br />
    "While"    Expression<out exp>            (.    <br />
                                            util.Writeline("while (" + exp + ")");<br />
                                            util.OpenBlock();<br />
                                        .)<br />
    |<br />
                                        (.    <br />
                                            util.Writeline("do");<br />
                                            util.OpenBlock();<br />
                                        .)<br />
)<br />
RoutineBody<br />
"Loop"<br />
(<br />
"While" Expression<out exp>                (.    <br />
                                            util.CloseBlock();<br />
                                            util.Writeline("while (" + exp + ")");<br />
                                        .)<br />
|<br />
"Until"    Expression<out exp>                (.    <br />
                                            util.CloseBlock();<br />
                                            util.Writeline("while (!(" + exp + "))");<br />
                                        .)<br />
|<br />
                                        (.    <br />
                                            util.CloseBlock();<br />
                                        .)<br />
)<br />
.<br />
<br />
ExitStmt =<br />
"Exit"<br />
("For" | "While" | "Do")        (.    util.Writeline("break;"); .)<br />
.<br />
<br />
WhileStmt =<br />
                                (.    string exp; .)<br />
"While"<br />
Expression<out exp>                (.    <br />
                                    util.Writeline("while (" + exp + ")");<br />
                                    util.OpenBlock();<br />
                                .)<br />
[RoutineBody]<br />
"End" "While"                        (.    util.CloseBlock(); .)<br />
.<br />
<br />
ForVar =<br />
                                (.<br />
                                    string loopvar;<br />
                                    string expIni;<br />
                                    string expEnd;<br />
                                    string stepExp;<br />
                                    string stepCS;<br />
                                .)<br />
QualName<out loopvar>            (.    stepCS = loopvar + "++"; .)<br />
"="<br />
Expression<out expIni><br />
"To"<br />
Expression<out expEnd><br />
[<br />
"Step"<br />
Expression<out stepExp>            (.    stepCS = loopvar + " += " + stepExp; .)<br />
]                                (.<br />
                                    util.Writeline(string.Format("for ({0}={1}; {0} <= {2}; {3})", loopvar, expIni, expEnd, stepCS));<br />
                                    util.OpenBlock();<br />
                                .)<br />
RoutineBody<br />
"Next"        [identifier]        (.<br />
                                    util.CloseBlock();<br />
                                .)<br />
.<br />
<br />
ForEach =<br />
                                (.<br />
                                    string loopvar;<br />
                                    string expIni;<br />
                                .)<br />
"Each"<br />
QualName<out loopvar><br />
"In"<br />
Expression<out expIni><br />
                                (.<br />
                                    util.Writeline(string.Format("foreach ({0} in {1})", loopvar, expIni));<br />
                                    util.OpenBlock();<br />
                                .)<br />
RoutineBody<br />
"Next"    [identifier]            (.<br />
                                    util.CloseBlock();<br />
                                .)<br />
.<br />
<br />
<br />
ForStmt =<br />
"For"<br />
(<br />
ForVar<br />
|<br />
ForEach<br />
)<br />
.<br />
<br />
CallStmt =<br />
                                (.    <br />
                                    string funcname;<br />
                                    string parms = "";<br />
                                .)<br />
"Call"<br />
QualName<out funcname><br />
[<br />
Callparms<out parms><br />
]                                (.    util.Writeline(funcname + parms + ";"); .)<br />
.<br />
<br />
ReturnStmt =<br />
                            (.    string exp; .)<br />
"Return"<br />
Expression<out exp>            (.    util.Writeline("return " + exp + ";"); .)<br />
.<br />
<br />
TryCatch =<br />
                                            (.  string varname = "Exception"; .)<br />
"Try"                                        (.<br />
                                                util.Writeline("try");<br />
                                                util.OpenBlock();<br />
                                            .)<br />
RoutineBody<br />
[<br />
"Catch"<br />
    [<br />
    VarDeclaration<out varname><br />
    ]                                        (.<br />
                                                util.CloseBlock();<br />
                                                util.Writeline("catch (" + varname + ")");<br />
                                                util.OpenBlock();<br />
                                            .)<br />
[RoutineBody]<br />
]<br />
[<br />
"Finally"                                    (.<br />
                                                util.CloseBlock();<br />
                                                util.Writeline("finally");<br />
                                                util.OpenBlock();<br />
                                            .)<br />
RoutineBody<br />
]<br />
"End" "Try"                                    (.<br />
                                                util.CloseBlock();<br />
                                            .)<br />
.<br />
<br />
SelectCase =<br />
                                            (. string exp; .)<br />
"Select" "Case"<br />
Expression<out exp><br />
                                            (.<br />
                                                util.Writeline("switch (" + exp + ")");<br />
                                                util.OpenBlock();<br />
                                            .)<br />
CaseStmts<br />
"End" "Select"                                (.    util.CloseBlock(); .)<br />
.<br />
<br />
CaseStmt =<br />
                                            (.    string exp; .)<br />
"Case"<br />
(<br />
"Else"                                        (.<br />
                                                util.Writeline("default:");<br />
                                                util.Ident();<br />
                                            .)<br />
<br />
|<br />
Expression<out exp>                            (.    <br />
                                                util.Writeline("case " + exp + ":");<br />
                                                util.Ident();<br />
                                            .)<br />
{<br />
","<br />
Expression<out exp>                            (.<br />
                                                util.Unident();<br />
                                                util.Writeline("case " + exp + ":");<br />
                                                util.Ident();<br />
                                            .)<br />
}									<br />
)<br />
										<br />
RoutineBody                                    (.util.Writeline("break;"); .)<br />
											(.<br />
                                                util.Unident();<br />
                                            .)<br />
.<br />
<br />
CaseStmts =<br />
CaseStmt<br />
{ CaseStmt }<br />
.<br />
<br />
ElseStmt =<br />
                                        (.    string exp; .)<br />
("Else"                                    (.<br />
                                            util.CloseBlock();<br />
                                            util.Writeline("else");<br />
                                            util.OpenBlock();<br />
                                        .)<br />
RoutineBody<br />
|<br />
"ElseIf"<br />
Expression<out exp><br />
"Then"                                    (.    util.CloseBlock();<br />
                                            util.Writeline("else if (" + exp + ")");<br />
                                            util.OpenBlock();<br />
                                         .)<br />
RoutineBody<br />
[ElseStmt]<br />
)<br />
.<br />
<br />
IfStmt =<br />
                                        (.    string exp; .)<br />
"If"<br />
Expression<out exp><br />
"Then"                                    (.    <br />
                                            util.Writeline("if (" + exp + ")");<br />
                                            util.OpenBlock();<br />
                                         .)<br />
RoutineBody<br />
[ElseStmt]<br />
"End" "If"                                (.<br />
                                            util.CloseBlock();<br />
                                        .)<br />
.<br />
<br />
LeftAssign<out string call> =<br />
                                    (.    string typename, pl, call2; .)<br />
QualName<out typename>                (.    call = typename; .)<br />
[<br />
    Callparms<out pl>                (.    call += pl; .)<br />
    [<br />
        "."<br />
        LeftAssign<out call2>        (.    call += "." + call2; .)<br />
    ]<br />
]<br />
.<br />
<br />
AssignCall =<br />
                                    (.    string call;<br />
                                        string operation = "";<br />
                                        string rvalue = null;<br />
                                    .)<br />
LeftAssign<out call><br />
[<br />
[<br />
"+=" 			(.    operation = token.val;    .)<br />
| <br />
"-=" 			(.    operation = token.val;    .)<br />
| <br />
"+" 			(.    operation = token.val;    .)<br />
| <br />
"-" 			(.    operation = token.val;    .)<br />
| <br />
"*" 			(.    operation = token.val;    .)<br />
| <br />
"/" 			(.    operation = token.val;    .)<br />
| <br />
"&"             (.    operation = token.val;    .)<br />
]<br />
"="<br />
Expression<out rvalue><br />
]                                    (.    <br />
                                        if (rvalue != null)<br />
                                        	if (operation != "")<br />
                                            	util.Writeline(call + " " + operation + " " + rvalue + ";");<br />
                                        	else<br />
                                        		util.Writeline(call + " " + "= " + rvalue + ";");<br />
                                        else<br />
                                            util.Writeline(call + ";");<br />
                                    .)<br />
.<br />
<br />
LocalDeclaration =<br />
                                    (.<br />
                                        string decl;<br />
                                        string constant = "";<br />
                                    .)<br />
(<br />
"Dim"<br />
|<br />
"Const"                                (.    constant = "const "; .)<br />
)<br />
VarDeclaration<out decl>            (. util.Writeline(constant + decl + ";"); .)<br />
{ ","<br />
VarDeclaration<out decl>            (. util.Writeline(constant + decl + ";"); .)<br />
}<br />
.<br />
<br />
ParameterList<out string paramList> =<br />
                                    (. string decl; .)<br />
"("                                    (. paramList = token.val; .)<br />
[<br />
ParameterDeclaration<out decl>        (. paramList += decl; .)<br />
{<br />
","                                    (. paramList += token.val + " "; .)<br />
ParameterDeclaration<out decl>        (. paramList += decl; .)<br />
}<br />
]<br />
")"                                    (. paramList += token.val; .)<br />
.<br />
<br />
ParameterDeclaration<out string declaration> =<br />
                                    (. string decl; .)<br />
["ByVal" | "ByRef"]"                   (. declaration = util.ConvertByX(token.val); .)<br />
VarDeclaration<out decl>            (. declaration += decl; .)<br />
.<br />
<br />
<br />
<br />
END VBNET.<br />


Util.cs

using VBNET;<br />
using System;<br />
using System.IO;<br />
using System.Collections.Specialized;<br />
<br />
namespace GBVB<br />
{<br />
    public class Util<br />
    {<br />
        string identStr = "";<br />
<br />
        public TextWriter output;<br />
<br />
        StringCollection linePush = new StringCollection();<br />
        System.Collections.Stack stackClassname = new System.Collections.Stack();<br />
        System.Collections.Hashtable evtHandleTable = new System.Collections.Hashtable();<br />
<br />
        public void PushClassName(string classname)<br />
        {<br />
            stackClassname.Push(classname);<br />
        }<br />
<br />
        public void PopClassName()<br />
        {<br />
            stackClassname.Pop();<br />
        }<br />
<br />
        public string GetClassName()<br />
        {<br />
            object classname = stackClassname.Peek();<br />
            if (classname == null)<br />
                return "";<br />
<br />
            return (string)classname;<br />
        }<br />
<br />
        public string GetEvtHandlerName(string paramlist)<br />
        {<br />
            if (evtHandleTable.ContainsKey(paramlist))<br />
            {<br />
                return (string)evtHandleTable[paramlist];<br />
            }<br />
<br />
            string evtHandlerName = GetClassName() + "EventHandler";<br />
            for (int i = 1; (evtHandleTable.ContainsValue(evtHandlerName)); i++)<br />
            {<br />
                evtHandlerName = GetClassName() + "EventHandler" + i.ToString();<br />
            }<br />
<br />
            evtHandleTable.Add(paramlist, evtHandlerName);<br />
<br />
            return evtHandlerName;<br />
        }<br />
<br />
        public void WriteDelegates()<br />
        {<br />
            Writeline("// Delegates");<br />
            foreach (string paramlist in evtHandleTable.Keys)<br />
            {<br />
                Writeline("public delegate void " + evtHandleTable[paramlist] + paramlist + ";");<br />
            }<br />
        }<br />
<br />
        public void Ident()<br />
        {<br />
            identStr += "    ";<br />
        }<br />
<br />
        public void Unident()<br />
        {<br />
            identStr = identStr.Substring(0, identStr.Length - 4);<br />
        }<br />
<br />
        public void OpenBlock()<br />
		{<br />
			Writeline("{");<br />
			//output.Write(" {" + Environment.NewLine);<br />
			Ident();<br />
        }<br />
<br />
        public void CloseBlock()<br />
        {<br />
            Unident();<br />
            Writeline("}" + Environment.NewLine);<br />
        }<br />
<br />
        public void Writeline(string line)<br />
        {<br />
            output.Write(identStr);<br />
            output.WriteLine(line);<br />
            if (linePush.Count != 0)<br />
            {<br />
                foreach (string s in linePush)<br />
                {<br />
                    output.Write(identStr);<br />
                    output.WriteLine(s);<br />
                }<br />
                linePush.Clear();<br />
            }<br />
        }<br />
<br />
        public void PushLine(string line)<br />
        {<br />
            linePush.Add(line);<br />
        }<br />
<br />
        public string ConvertModifier(string mod)<br />
        {<br />
            switch (mod)<br />
            {<br />
                case "Overloads":<br />
                    return "";<br />
				case "Overrides":<br />
					return "override";<br />
                case "Shared":<br />
					return "static";<br />
                case "Friend":<br />
					return "internal";<br />
				case "Shadows":<br />
					return "new";<br />
                case "ReadOnly":<br />
                    return "";<br />
                case "WithEvents":<br />
                    return "";<br />
                default:<br />
                    return mod.ToLower() + "";<br />
            }<br />
        }<br />
<br />
        public string ConverteTipo(string tipo)<br />
        {<br />
            switch (tipo)<br />
            {<br />
				case "Integer":<br />
				case "Int32":<br />
                    return "int";<br />
                case "String":<br />
                    return "string";<br />
                case "Object":<br />
                    return "object";<br />
                case "Boolean":<br />
                    return "bool";<br />
                case "Long":<br />
					return "long";<br />
                case "Single":<br />
                    return "float";<br />
                case "Double":<br />
                    return "double";<br />
                case "Short":<br />
                    return "short";<br />
                case "Byte":<br />
                    return "byte";<br />
                case "Char":<br />
                    return "char";<br />
                case "Text":<br />
                    return "text";<br />
                default:<br />
                    if (tipo.StartsWith("Me."))<br />
                    {<br />
                        tipo = "this." + tipo.Substring(3);<br />
                    }<br />
<br />
                    if (tipo.StartsWith("MyBase."))<br />
                    {<br />
                        tipo = "base." + tipo.Substring(7);<br />
                    }<br />
<br />
                    return tipo;<br />
            }<br />
        }<br />
<br />
        public string ConverteString(string str)<br />
        {<br />
            if (str.IndexOf('\\') >= 0)<br />
                return "@" + str;<br />
            else<br />
                return str;<br />
        }<br />
<br />
        public string ConverteLogicalOp(string str)<br />
        {<br />
            switch (str)<br />
            {<br />
                case "=":<br />
                    return " == ";<br />
                case "<>":<br />
                    return " != ";<br />
                default:<br />
                    return " " + str + " ";<br />
            }<br />
        }<br />
<br />
        public string ConvertByX(string byx)<br />
        {<br />
            if (byx == "ByVal")<br />
                return "";<br />
            else<br />
                return "ref ";<br />
        }<br />
    }<br />
}<br />


Peace all.

Try not! Do or do not, there is no try. - Master Yoda
GeneralThanks Pin
SteveSchofield20-Dec-03 21:02
SteveSchofield20-Dec-03 21:02 
GeneralVB &quot;Handles&quot; statement Pin
ppadilla12-Nov-03 8:45
ppadilla12-Nov-03 8:45 
GeneralVery Good Pin
raygilbert9-Nov-03 17:25
raygilbert9-Nov-03 17:25 
GeneralRe: Very Good Pin
OmegaSupreme13-Feb-04 4:36
OmegaSupreme13-Feb-04 4:36 
GeneralRe: Very Good Pin
OmegaSupreme15-Feb-04 7:15
OmegaSupreme15-Feb-04 7:15 
GeneralRe: Very Good - not good Pin
vietht14-Nov-06 21:23
vietht14-Nov-06 21:23 
GeneralParsing Error Pin
Jeffrey Scott Flesher17-Oct-03 15:05
Jeffrey Scott Flesher17-Oct-03 15:05 
QuestionWhy not anakrino? Pin
soeren7611-Sep-03 0:04
soeren7611-Sep-03 0:04 
AnswerRe: Why not anakrino? Pin
soeren7611-Sep-03 0:09
soeren7611-Sep-03 0:09 
Generaldon't download!! Pin
cyg27-Jul-03 3:50
cyg27-Jul-03 3:50 
Questionputting code comments into the final assembly? Pin
CodeFriendly29-Jun-03 11:58
CodeFriendly29-Jun-03 11:58 
AnswerRe: putting code comments into the final assembly? Pin
Daniel Turini29-Jun-03 13:15
Daniel Turini29-Jun-03 13:15 
GeneralRe: putting code comments into the final assembly? Pin
CodeFriendly29-Jun-03 14:14
CodeFriendly29-Jun-03 14:14 
GeneralInterest in your modified Coco/R Pin
spi18-Jun-03 6:37
professionalspi18-Jun-03 6:37 
GeneralFew more links Pin
Kant3-Jun-03 17:23
Kant3-Jun-03 17:23 
GeneralRe: Few more links Pin
vbweb19-Apr-04 9:08
vbweb19-Apr-04 9:08 
GeneralLove it ! Pin
Glen Banta22-May-03 7:36
Glen Banta22-May-03 7:36 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.