[antlr-interest] @rulecatch in a C environment

Pierre Attar pat at tireme.fr
Wed Apr 9 05:53:25 PDT 2008


Jim,

Thanks a lot for your answer. I've now remove all "after" clauses and 
try to work on the displayrecognitionError function.

As you should have notice, I'm not a C guru and trying to do your mind, 
I got the following error :

..FFormParser.c(326) : error C2039: 'displayrecognitionError' : is not a 
member of 'FFormParser_Ctx_struct'
2>        ..\antlrgen\FFormParser.h(317) : see declaration of 
'FFormParser_Ctx_struct'

Which means, I assume, that I also need somewhere to declare the my 
overwriting function? Can you explain me the way to do that ?

Pierre

Jim Idle a écrit :
> We need to add better support so that targets can tell you whether the section you are using is supported. @after currently isn't officially supported though I have been playing around with it.
>
> Rather than try to do this through things like rule catch, just override the displayRecognitionError routine, or routines tath are called before that is called if you find a need.
>
> At that point you can find out everything you would normally need to know, including what rule/alt the parser was in and the expected token set (if this can be worked out) and so on.
>
> >From the C API docs:
>
> Unless you wish to create your own tree structures using the built in ANTLR AST rewriting
> notation, you will rarely need to override the default implementation of runtime methods. The
> exception to this will be the syntax err reporting method, which is essentially a stub function
> that you will usually want to provide your own implementation for. You should consider the built in function
> displayRecognitionError() as an example of where to start as there can be no really useful
> generic error message display.
>
>
> In your grammar you can do this:
>
> @parser::apifuncs
> {
> 	// Override the standard error display and install my own.
>       // Look at the runtime library code to see what the default one
>       // does to find things out, then do what I want in my version.
>       ..
> 	ctx->displayrecognitionError = myDisplayrecognitionError;
> }
>
> Jim
>
>   
>> -----Original Message-----
>> From: antlr-interest-bounces at antlr.org [mailto:antlr-interest-
>> bounces at antlr.org] On Behalf Of Pierre Attar
>> Sent: Tuesday, April 08, 2008 6:14 AM
>> To: antlr-interest at antlr.org
>> Subject: [antlr-interest] @rulecatch in a C environment
>>
>> Hi,
>>
>> I want to catch recognition errors on my parsing. In order to achieve
>> this, I've creating the following rulecatch:
>>
>> @rulecatch {
>>     pANTLR3_EXCEPTION exe = EXCEPTION;
>>     if(NULL != exe) {
>>         char    buffer[100];
>>         sprintf(buffer, "\%s", exe->name);
>>         cout << "Got an exception in parsing recognition: " << buffer;;
>>     }
>> }
>>
>> This works fine except that when nothing is provided, the generation is
>> :
>>     if (HASEXCEPTION())
>>     {PREPORTERROR();
>>         PRECOVER(); }
>>     else
>>     {{resultTree= doc;}}
>>
>> ... where the line is an @after clause.
>>
>>
>> My problem ? As soon as I put my rulecatcher, the after clause is no
>> more generated.
>>
>> I would be very glad to understand what I've done wrong here and also,
>> if someone have a sample I may clone, it would help me.
>>
>> Thanks a lot, Pierre
>>
>>
>>
>>     
>
>
>
>
>
>
>
>   



More information about the antlr-interest mailing list