[antlr-interest] C#: Unhandled NoViableAltexception from lexer

Shawn Poulson spoulson at explodingcoder.com
Wed Sep 3 20:36:48 PDT 2008


Hello again,

 

I finally found the solution to this issue.  For the records, I thought I'd
post it up incase anyone else needed to know.

 

This is actually a byproduct of a default profile setting in Visual Studio
2005 and 2008.  There is a feature that allows you to break on exceptions
thrown and handled, regardless if there is a handler to catch the exception
and tell you it was unhandled anyway.  I found some discussion about this at
this page:
http://www.dotnetmonster.com/Uwe/Forum.aspx/vs-net-ide/4729/Disabling-Just-m
y-code-changes-Debug-Exceptions-dialog.

 

This behavior can be disabled two ways:

-          Go to Tools|Options|Debugging|General and uncheck "Enable Just My
Code"

-          Go to Debugger|Exceptions and uncheck "User-handled" in the CLR
row

 

I was also missing the Debugger|Exceptions menu item, which was fixed by
adjusting my profile, which had this option disabled by default.
http://www.williamkent.net/archive/2007/09/12/exception-item-missing-from-my
-vs2005-debug-menu.aspx

 

Once this was sorted out, ANTLR works perfectly when parsing invalid
parser/lexer input.

 

Shawn Poulson

 

 

From: Shawn Poulson [mailto:spoulson at explodingcoder.com] 
Sent: Sunday, August 31, 2008 11:28 PM
To: 'antlr-interest at antlr.org'
Subject: C#: Unhandled NoViableAltexception from lexer

 

Hello all,

 

I'm struggling with what appears to be an unexpected behavior in my C# code.
When I attempt to parse a string with my grammar, it works as long as the
input is valid to my parser rules.  When the parser bawks at the input I get
an exception derived from RecognitionException and my code can handle
invalid input.  When the lexer bawks, I usually get a NoViableAltException
thrown that I'm also able to handle.

 

Except, in a specific case my code is unable to handle a
NoViableAltException within a try/catch block.  For example, my grammar does
not utilize semicolons anywhere.  So, if I feed it an input with a semi
anywhere in the input, the lexer will choke and throw a
NoViableAltException, as expected.  For some reason, even if my code
surrounds the ANTLR parser call with a try/catch(Exception) block, the
program execution halts with an unhandled exception.

 

I experienced this with ANTLR 3.0.1, in which case the exception was thrown
from the lexer's mTokens() method.  I noticed ANTLR 3.1 was released
recently, so I gave that a try and used the new CSharp2 target.  I get the
same exact symptom, with the exception being thrown from
Antlr3.Runtime.DFA.Predict().  In both revisions, I've browsed the code
using .NET Reflector and I don't see any funny business going on.  I don't
see any reason why a try/catch block cannot trap this exception!

 

I'm using VS 2008.  I've attempted with .NET 2.0 and .NET 3.5 framework
targets and got the same results.  If necessary, I can send a project that
replicates this issue.

 

Has anyone experienced this before?  Thanks.

 

Shawn Poulson

spoulson at explodingcoder.com

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20080903/63b9048e/attachment.html 


More information about the antlr-interest mailing list