program:        command+ EOF; // Force the parser to consume token stream

Jim

> -----Original Message-----
> From: [email protected] [mailto:antlr-interest-
> [email protected]] On Behalf Of Hélder Silva
> Sent: Tuesday, April 12, 2011 7:07 AM
> To: [email protected]
> Subject: Re: [antlr-interest] Diferent output when running ANTLRWorks
> IDE and a test rig in both Java and C# versions
>
> This is my current grammar:
>
> grammar Oven;
>
> options
> {
>     language=CSharp2;
> //    language=Java;
>     output=AST;
>     ASTLabelType=CommonTree; // Cria arvore para ser utilizada por
> outro parser a executar funções }
>
> @lexer::members
> {
>       bool emailMode = false;
> }
> @members
> {
> //to create more understandable error phrases for users Stack
> paraphrases = new Stack();
>
> public override string GetErrorMessage(RecognitionException e, string[]
> tokenNames) {
>       IList stack = GetRuleInvocationStack(e,
> this.GetType().ToString());
>       string msg = null;
>       if ( e.GetType()==typeof(NoViableAltException) )
>       {
>               NoViableAltException nvae = (NoViableAltException)e;
>               msg = " no viable alt; token="+e.Token+
>               " (decision="+nvae.decisionNumber+
>               " state "+nvae.stateNumber+")"+
>               " decision=<<"+nvae.grammarDecisionDescription+">>";
>       }
>       else
>       {
>               msg = base.GetErrorMessage(e, tokenNames);
>       }
> //    return stack+" "+msg;
>       for(int i=0;i<stack.Count;i++)
>               msg = msg+" at "+stack[i];
>       for(int i=0;i<paraphrases.Count;i++ )
>       {
>               String paraphrase = (String)paraphrases.Peek();
>               msg = msg+" "+paraphrase;
>       }
>       return msg;
> }
>
> //To stop parsing after first error happens!!
> protected override void Mismatch(IIntStream input, int ttype, BitSet
> follow) //throws RecognitionException {
>       throw new MismatchedTokenException(ttype, input); }
>
> public override object RecoverFromMismatchedSet(IIntStream input,
> RecognitionException e, BitSet follow) //throws RecognitionException {
>       throw e;
> }
>
> protected override object RecoverFromMismatchedToken(IIntStream input,
> int ttype, BitSet follow) {
>       throw new MismatchedTokenException(ttype,input);
> }
>
> }
>
> // Alter code generation so catch-clauses get replace with // this
> action.
> @rulecatch
> {
> catch(RecognitionException e)
> {
>       throw e;
> }
> }
>
> program:      command+;
>
> command
> @init { paraphrases.Push("in command"); } @after { paraphrases.Pop(); }
>       :       cmd_set
>       |       cmd_turn
>       |       cmd_wait
>       |       cmd_sync
>       |       cmd_email
>       |       cmd_log
>       ;
> cmd_set
> @init { paraphrases.Push("set"); }
> @after { paraphrases.Pop(); }
>       : SET VALVE TO? INT FLUX TERMINATOR -> ^(SET VALVE INT)
>       | SET ZONE a=INT TO b=INT DEGREES? TEMPUNITS TERMINATOR -> ^(ZONE
> $a $b TEMPUNITS)
>       ;
> cmd_turn
> @init { paraphrases.Push("turn"); }
> @after { paraphrases.Pop(); }
>       : TURN VALVE STATE TERMINATOR -> ^(TURN VALVE STATE)
>       | TURN ZONE INT STATE TERMINATOR -> ^(TURN ZONE INT STATE)
>       ;
> cmd_wait
> @init { paraphrases.Push("wait"); }
> @after { paraphrases.Pop(); }
>       : WAIT FOR INT TIMEUNITS TERMINATOR -> ^(WAIT INT TIMEUNITS)
>       | WAIT UNTIL ZONE a=INT TEMPERATURE LESS_THAN b=INT DEGREES
> TEMPUNITS TERMINATOR -> ^(WAIT ZONE $a LESS_THAN $b TEMPUNITS)
>       | WAIT UNTIL ZONE a=INT TEMPERATURE GREATER_THAN b=INT DEGREES
> TEMPUNITS TERMINATOR -> ^(WAIT ZONE $a GREATER_THAN $b TEMPUNITS)
>       | WAIT UNTIL ZONE a=INT TEMPERATURE EQUAL b=INT DEGREES TEMPUNITS
> TERMINATOR -> ^(WAIT ZONE $a EQUAL $b TEMPUNITS)
>       ;
> cmd_sync
> @init { paraphrases.Push("sync"); }
> @after { paraphrases.Pop(); }
>       : SYNC ZONES TERMINATOR -> ^(SYNC ZONES)
>       ;
> cmd_email
> @init { paraphrases.Push("email"); }
> @after { paraphrases.Pop(); }
>       : EMAIL MAILADDRESS MESSAGE TERMINATOR -> ^(EMAIL MAILADDRESS
> MESSAGE)
>       ;
> cmd_log
> @init { paraphrases.Push("log"); }
> @after { paraphrases.Pop(); }
>       : TURN LOG STATE TERMINATOR -> ^(TURN LOG STATE)
>       ;
>
> // START:tokens
> SET   :       'set';
> TURN  :       'turn';
> WAIT  :       'wait';
> EMAIL :       'email' {emailMode=true;};
> SYNC  :       'sync';
> TO    :       'to';
> DEGREES       :       'deg'|'degrees';
> FOR   :       'for';
> UNTIL :       'until';
> ZONE  :       'zone';
> ZONES :       'zones';
> TEMPERATURE
>       :       'temperature';
> LOG   :       'log';
>
> STATE :       'on'
>       |       'off'
>       ;
> FLUX  :       'sccm';
> TIMEUNITS
>       :       ('sec'|'seconds')
>       |       ('min'|'minutes')
>       |       ('hr'|'hours')
>       ;
> TEMPUNITS
>       :       ('ºC'|'C'|'ºc'|'c')
>       |       ('ºF'|'F'|'ºf'|'f')
>       ;
> LESS_THAN
>       :       '<';
> GREATER_THAN
>       :       '>';
> EQUAL :       '=';
>
> VALVE:'helium'|'ethylene'|'hydrogen';
> MAILADDRESS:{emailMode}?=>('a'..'z'|'A'..'Z'|'0'..'9'|'.'|'_')+ '@'
> ('a'..'z'|'A'..'Z'|'0'..'9'|'.'|'_')+;
> INT:   ('0'..'9')+ ;
> MESSAGE
> @init{emailMode=false;}
>       :       '"' ((options{greedy=false;}: .)*) '"';
> WS  : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;};
> COMMENT       :        '\'' ~('\'') '\'' {$channel=HIDDEN;};
> LINE_COMMENT : '\'' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;};
> TERMINATOR: ';';
> // END:tokens
>
>
> For input such as:
>
> set helium to 220 sccm;
> on off turn helium on;
> turn helium off;
>
> The C# parser doesn’t generate a NoViableAltException, which is what
> happens in ANTLRWorks. All commands after first erroneous one are
> disregarded also...
> During C# code debug, I can see it fail to match any command after the
> first one (because token stream is wrong), and just exit without
> exception, apparently not consuming all of the tokens available.
> Lexer seems to be doing its job correctly I think...
> I've tried to comment some rules out so I could isolate the ambiguous
> lexer rule, but I can't see why this is happening here...
>
>
> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]] On Behalf Of Jim Idle
> Sent: sexta-feira, 8 de Abril de 2011 17:14
> To: [email protected]
> Subject: Re: [antlr-interest] Diferent output when running ANTLRWorks
> IDE and a test rig in both Java and C# versions
>
> Well the hint is that your grammar is wrong.
>
> But you need to post your grammar to get more help :-). I think, from
> the way you describe your problem, that perhaps you have ambiguous
> lexer rules and think that the parser influences what lexer rule is
> run, which it does not.
>
> Also, make sure you run the debugger in AntrlWorks and check any
> warning messages when you generate the code.
>
> Jim
>
>
>
> > -----Original Message-----
> > From: [email protected] [mailto:antlr-interest-
> > [email protected]] On Behalf Of Hélder Silva
> > Sent: Friday, April 08, 2011 3:46 AM
> > To: [email protected]
> > Subject: [antlr-interest] Diferent output when running ANTLRWorks IDE
> > and a test rig in both Java and C# versions
> >
> > I’m getting different results when i run a certain input on the IDE
> in
> > comparison to a test rig in either Java or C# as well.
> >
> >
> >
> > In the IDE, for a given input, I get a NoViableAltException, which is
> > what I want to happen.
> >
> >
> >
> > When running the same input on Java test rig I get this:
> >
> > line 1:3 mismatched character ' ' expecting '@'
> >
> > line 1:4 required (...)+ loop did not match anything at input
> 'helium'
> >
> > The “expecting ‘@’” i suppose the parser is looking for another token
> > I have in which it matches an email address, but no rule I have
> starts
> > with an email address either.
> >
> >
> >
> > In the C# test rig, the parser complains there is no input with the
> > message:
> >
> > line 1:4 required (...)+ loop did not match anything at input
> 'helium'
> >
> > can someone give me a hint on what’s happening here?
> >
> >
> >
> >
> > List: http://www.antlr.org/mailman/listinfo/antlr-interest
> > Unsubscribe: http://www.antlr.org/mailman/options/antlr-
> interest/your-
> > email-address
>
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe:
> http://www.antlr.org/mailman/options/antlr-interest/your-email-address
>
>
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-
> email-address

List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe: 
http://www.antlr.org/mailman/options/antlr-interest/your-email-address

-- 
You received this message because you are subscribed to the Google Groups 
"il-antlr-interest" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/il-antlr-interest?hl=en.

Reply via email to