[antlr-interest] C Target won't compile with MSVC

Ivan Brezina ibre5041 at ibrezina.net
Thu Jul 7 01:11:44 PDT 2011


Hi
I'm not sure whether this is a bug or not.
In my grammar I use following rule to match Perl style
quoted strings:

/* Perl-style quoted string */
QSTRING             : ('q'|'Q') ( QS_ANGLE | QS_BRACE | QS_BRACK |  
QS_PAREN | QS_OTHER) ;
fragment QS_ANGLE   : QUOTE '<' ( options {greedy=false;} : . )* '>' QUOTE ;
fragment QS_BRACE   : QUOTE '{' ( options {greedy=false;} : . )* '}' QUOTE ;
fragment QS_BRACK   : QUOTE '[' ( options {greedy=false;} : . )* ']' QUOTE ;
fragment QS_PAREN   : QUOTE '(' ( options {greedy=false;} : . )* ')' QUOTE ;

fragment QS_OTHER_CH: ~('<'|'{'|'['|'('|' '|'\t'|'\n'|'\r');
fragment QS_OTHER
		@init {
     		ANTLR3_UINT32 (*oldLA)(struct ANTLR3_INT_STREAM_struct *, ANTLR3_INT32);
			oldLA = INPUT->istream->_LA;
             INPUT->setUcaseLA(INPUT, ANTLR3_FALSE);
		}
		:
		QUOTE delimiter=QS_OTHER_CH
/* JAVA Syntax */
// 		( { input.LT(1) != $delimiter.text.charAt(0) || ( input.LT(1) ==  
$delimiter.text.charAt(0) && input.LT(2) != '\'') }? => . )*
// 		( { input.LT(1) == $delimiter.text.charAt(0) && input.LT(2) ==  
'\'' }? => . ) QUOTE
/* C Syntax */
		( { LA(1) != $delimiter->getText(delimiter)->chars[0] || LA(2) !=  
'\'' }? => . )*
		( { LA(1) == $delimiter->getText(delimiter)->chars[0] && LA(2) ==  
'\'' }? => . ) QUOTE
  		{ INPUT->istream->_LA = oldLA; }
		;

The problem is, that I need to declare my own variable inside @init section.

Antlr generates such a C source:

static ANTLR3_INLINE
void mQS_OTHER(pOracleSQLLexer ctx)
{
	ANTLR3_UINT32	_type;
     pANTLR3_COMMON_TOKEN delimiter;


     delimiter = NULL;


         		ANTLR3_UINT32 (*oldLA)(struct ANTLR3_INT_STREAM_struct *,  
ANTLR3_INT32);
     			oldLA = INPUT->istream->_LA;
                 INPUT->setUcaseLA(INPUT, ANTLR3_FALSE);

... etc.

MSVC complains that the variable oldLA is declared AFTER assignment  
statement. Could you modify the it into this?

static ANTLR3_INLINE
void mQS_OTHER(pOracleSQLLexer ctx)
{
     ANTLR3_UINT32	_type;
     pANTLR3_COMMON_TOKEN delimiter = NULL;

     ANTLR3_UINT32 (*oldLA)(struct ANTLR3_INT_STREAM_struct *, ANTLR3_INT32);
     oldLA = INPUT->istream->_LA;
     INPUT->setUcaseLA(INPUT, ANTLR3_FALSE);

...etc

Ivan





----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.



More information about the antlr-interest mailing list