Hi. [I'm moving this to the interest list as it is about using not building 
antlr]

Do you have backtrack=true anywhere?  do you have "=>" operators anywhere? I 
believe that is the only way it will wrap those actions.

Ter
On Feb 28, 2011, at 12:18 PM, Susanna Siebert wrote:

> Hi everybody,
> 
> we are trying to add custom bracematching to our language, Hop. For example, 
> our functions are designed in the form action myAction .. end, where we are 
> trying to match the "action" with the "end". To do that we added some 
> semantic actions to the appropriate rules in the *.g file, that add some 
> information about the position of the tokens to a hash table in a matcher 
> module. This works fine except for the if-else-statements. These look like so:
> 
> if_statement    
>     :
>     firstif = IF root_expression THEN { symbol.add(new BlockDescriptor()); } 
> block { symbol.popScope(); } firstend = END 
>     {
>         MatchKeyword keyword1 = new MatchKeyword();
>         keyword1.setMatchID(((CommonToken)$firstif).getStartIndex());
>         keyword1.setStartOffset(((CommonToken)$firstif).getStartIndex() - 
> $firstif.getLine() + 1);
>         keyword1.setEndOffset(((CommonToken)$firstif).getStopIndex() - 
> $firstif.getLine() + 2);
>         keyword1.setIsPrefix(true); 
>         MatchKeyword keyword2 = new MatchKeyword();
>         keyword2.setMatchID(((CommonToken)$firstif).getStartIndex());
>         keyword2.setStartOffset(((CommonToken)$firstend).getStartIndex() - 
> $firstend.getLine() + 1);
>         keyword2.setEndOffset(((CommonToken)$firstend).getStopIndex() - 
> $firstend.getLine() + 2);
>         keyword2.setIsPrefix(false); 
>         matcher.addMatch(keyword1, keyword2);
>     }
>     ((firstelse = ELSE IF root_expression THEN { symbol.add(new 
> BlockDescriptor()); } block { symbol.popScope(); } secondend = END 
>     {
>         MatchKeyword keyword1 = new MatchKeyword();
>         keyword1.setMatchID(((CommonToken)$firstelse).getStartIndex());
>         keyword1.setStartOffset(((CommonToken)$firstelse).getStartIndex() - 
> $firstelse.getLine() + 1);
>         keyword1.setEndOffset(((CommonToken)$firstelse).getStopIndex() - 
> $firstelse.getLine() + 2);
>         keyword1.setIsPrefix(true); 
>         MatchKeyword keyword2 = new MatchKeyword();
>         keyword2.setMatchID(((CommonToken)$firstelse).getStartIndex());
>         keyword2.setStartOffset(((CommonToken)$secondend).getStartIndex() - 
> $secondend.getLine() + 1);
>         keyword2.setEndOffset(((CommonToken)$secondend).getStopIndex() - 
> $secondend.getLine() + 2);
>         keyword2.setIsPrefix(false); 
>         matcher.addMatch(keyword1, keyword2);
>     }
>     ) => (ELSE IF root_expression THEN block END))*  //else if blocks
>     ((secondelse = ELSE THEN { symbol.add(new BlockDescriptor()); } block { 
> symbol.popScope(); } thirdend = END
>     {
>         MatchKeyword keyword1 = new MatchKeyword();
>         keyword1.setMatchID(((CommonToken)$secondelse).getStartIndex());
>         keyword1.setStartOffset(((CommonToken)$secondelse).getStartIndex() - 
> $secondelse.getLine() + 1);
>         keyword1.setEndOffset(((CommonToken)$secondelse).getStopIndex() - 
> $secondelse.getLine() + 2);
>         keyword1.setIsPrefix(true); 
>         MatchKeyword keyword2 = new MatchKeyword();
>         keyword2.setMatchID(((CommonToken)$secondelse).getStartIndex());
>         keyword2.setStartOffset(((CommonToken)$thirdend).getStartIndex() - 
> $thirdend.getLine() + 1);
>         keyword2.setEndOffset(((CommonToken)$thirdend).getStopIndex() - 
> $thirdend.getLine() + 2);
>         keyword2.setIsPrefix(false); 
>         matcher.addMatch(keyword1, keyword2);
>     }
>     ) => (ELSE THEN block END) )? 
>     ;
> 
> The problem is that when the code is generated, the semantic actions are 
> being surrounded by an if-statement that checks state.backtracking (if 
> (state.backtracking == 0) {}). For the if-then part of the rule, this check 
> evaluates to true but for the else-if-then and else-then it evaluates to 
> false because state.backtracking is 1. However, backtracking is turned off. 
> 
> My questions now are: 
> Why is a check for state.backtracking added when code is generated even if 
> backtracking is turned off? 
> How can I make sure that the semantic actions of the else-if-then and 
> else-then are being executed? 
> 
> I appreciate your help.
> 
> Best regards,
> 
> Susanna Siebert
> _______________________________________________
> antlr-dev mailing list
> [email protected]
> http://www.antlr.org/mailman/listinfo/antlr-dev


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