[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