Hi

Using two grammars below, ANTLR generates code that is not compilable
with either C or C++ compiler. Specifically, generated file
"ExampleGrammarEval.c" contains expression "MyStruct value = NULL;"
which is not valid C/C++ (because value is not pointer) so the code
doesn't compile. There is a work around which makes
"ExampleGrammarEval.g" bigger and harder to read. Also, this
workaround is not practical to apply for larger struct with more
member variables.

Following are the 2 grammars needed to reproduce the bug, and the
third one that describes workaround.

-------------------------------------cut
here-----------------------------------------
grammar ExampleGrammar;

options {
  output=AST;
  ASTLabelType=pANTLR3_BASE_TREE;
  language=C;
}

tokens {
  PLUS  = '+';
}

prog : expr EOF!;
expr : addition;
addition : atom ( (PLUS)^ atom )*;
atom : NUMBER;
fragment DEC_DIGIT : '0'..'9' ;
NUMBER : DEC_DIGIT+;
WS : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;};
-------------------------------------cut
here-----------------------------------------

-------------------------------------cut
here-----------------------------------------
tree grammar ExampleGrammarEval;

options {
        tokenVocab=ExampleGrammar;
        ASTLabelType=pANTLR3_BASE_TREE;
        language=C;
}

@includes {
typedef struct {
        double d1, d2;
} MyStruct ;
}

prog returns [MyStruct value]
    : expr { $value = $expr.value; };

expr returns [MyStruct value]
    : addition { $value = $addition.value; };

addition returns [MyStruct value]
    : ^(PLUS a=atom b=atom) {
                $value.d1 = $a.value.d1 + $b.value.d1;
                $value.d2 = $a.value.d2 + $b.value.d2;
    }
        | atom {
        $value = $atom.value;
    };

atom returns [MyStruct value]
// Here is actually some parsing done to convert string into numerical
// value which is omited for simplicity.
    : NUMBER { value.d1 = value.d2 = 0.0 };
-------------------------------------cut
here-----------------------------------------

-------------------------------------cut
here-----------------------------------------
tree grammar ExampleGrammarEval;

options {
        tokenVocab=ExampleGrammar;
        ASTLabelType=pANTLR3_BASE_TREE;
        language=C;
}

@includes {
typedef struct {
        double d1, d2;
} MyStruct ;
}

prog returns [double d1, double d2]
    : expr { $d1 = $expr.d1; $d2 = $expr.d2; };

expr returns [double d1, double d2]
    : addition { $d1 = $addition.d1; $d2 = $addition.d2; };

addition returns [double d1, double d2]
    : ^(PLUS a=atom b=atom) {
                $d1 = $a.d1 + $b.d1;
                $d2 = $a.d2 + $b.d2;
    }
        | atom {
        $d1 = $a.d1; $d2 = $b.d2;
    };

atom returns [double d1, double d2]
// Here is actually some parsing done to convert string into numerical
// value which is omited for simplicity.
    : NUMBER { value.d1 = value.d2 = 0.0 };
-------------------------------------cut
here-----------------------------------------

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