I have actually two questions that I hope can be answered as they are semi-dependent on my work. Below is the grammar + tree grammar + Java test file.
What I am actually trying to achieve is the following:
Question 1:
I have a grammar that parses my language correctly. I would like to do some semantic checks on variable declarations. So I created a tree walker and so far it semi works. My problem is it's not capturing the whole string of expression. For example,
float x = 10 + 10;
It is only capturing the first part, i.e. 10. I am not sure what I am doing wrong. If I did it in one pass, it works. Somehow, if I split the work into a grammar and tree grammar, it is not capturing the whole string.
Question 2:
I would like to do a check on a rule such that if my conditions returns true, I would like to remove that subtree. For example,
float x = 10;
float x; // <================ I would like this to be removed.
I have tried using rewrite rules but I think it is more complex than that.
Test.g:
grammar Test;
options {
  language = Java;
  output = AST;
}
parse : varDeclare+
      ;
varDeclare : type id equalExp? ';'
           ;
equalExp : ('=' (expression | '...'))
         ;
expression : binaryExpression
           ;
binaryExpression : addingExpression (('=='|'!='|'<='|'>='|'>'|'<') addingExpression)*
                 ;
addingExpression : multiplyingExpression (('+'|'-') multiplyingExpression)*
                 ;
multiplyingExpression : unaryExpression 
                        (('*'|'/') unaryExpression)*
                      ;
unaryExpression: ('!'|'-')* primitiveElement;   
primitiveElement : literalExpression
                 | id
                 | '(' expression ')'
                 ;  
literalExpression : INT
                  ;              
id : IDENTIFIER
   ;
type : 'int'    
     | 'float'
     ; 
// L E X I C A L   R U L E S      
INT : DIGITS ;   
IDENTIFIER : LETTER (LETTER | DIGIT)*;
WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;
fragment LETTER : ('a'..'z' | 'A'..'Z' | '_') ;
fragment DIGITS: DIGIT+;
fragment DIGIT : '0'..'9';
TestTree.g:
tree grammar TestTree;
options {
  language = Java;
  tokenVocab = Test;
  ASTLabelType = CommonTree;
}
@members {
    SemanticCheck s;
    public TestTree(TreeNodeStream input, SemanticCheck s) {
        this(input);
        this.s = s;
    }
}
parse[SemanticCheck s]
      : varDeclare+
      ;
varDeclare : type id equalExp? ';'
           {s.check($type.name, $id.text, $equalExp.expr);}
           ;
equalExp returns [String expr]
         : ('=' (expression {$expr = $expression.e;} | '...' {$expr = "...";}))
         ;
expression returns [String e]
@after {$e = $expression.text;}
           : binaryExpression
           ;
binaryExpression : addingExpression (('=='|'!='|'<='|'>='|'>'|'<') addingExpression)*
                 ;
addingExpression : multiplyingExpression (('+'|'-') multiplyingExpression)*
                 ;
multiplyingExpression : unaryExpression 
                        (('*'|'/') unaryExpression)*
                      ;
unaryExpression: ('!'|'-')* primitiveElement;   
primitiveElement : literalExpression
                 | id
                 | '(' expression ')'
                 ;  
literalExpression : INT
                  ;              
id : IDENTIFIER
   ;
type returns [String name]
@after { $name = $type.text; }
     : 'int'    
     | 'float'
     ; 
Java test file, Test.java:
import java.util.ArrayList;
import java.util.List;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RuleReturnScope;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.CommonTreeNodeStream;
public class Test {
    public static void main(String[] args) throws Exception {
        SemanticCheck s = new SemanticCheck();
        String src = 
                "float x = 10+y; \n" + 
                "float x; \n";
        TestLexer lexer = new TestLexer(new ANTLRStringStream(src));
        //TestLexer lexer = new TestLexer(new ANTLRFileStream("input.txt"));
        CommonTokenStream tokenStream = new CommonTokenStream(lexer);
        TestParser parser = new TestParser(tokenStream);
        RuleReturnScope r = parser.parse();
        System.out.println("Parse Tree:\n" + tokenStream.toString());
        CommonTree t = (CommonTree)r.getTree();
        CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
        nodes.setTokenStream(tokenStream);
        TestTree walker = new TestTree(nodes, s);
        walker.parse(s);
    }
}
class SemanticCheck {
    List<String> names;
    public SemanticCheck() {
        this.names = new ArrayList<String>();
    }
    public boolean check(String type, String variableName, String exp) {
        System.out.println("Type: " + type + "  variableName: " + variableName + "  exp: " + exp);
        if(names.contains(variableName)) {
            System.out.println("Remove statement! Already defined!");
            return true;
        }
        names.add(variableName);
        return false;
    }
}
Thanks in advance!