I am following this tutorial and successfully replicated its behavior except that I am using Antlr 4.7 instead of the 4.5 that the tutorial was using.
I am trying to bui
Situation on October 24. 2017 at 19:00 UTC+1.
Your grammar works perfectly. I made a full test in Java.
File Expense.g4 :
grammar Expense;
payments
@init {System.out.println("Expense last update 1853");}
: (payment NL)*
;
payment
: PAY receiver amount=NUMBER
{System.out.println("Payement found " + $amount.text + " to " + $receiver.text);}
;
receiver
: surname=ID (lastname=ID)?
;
PAY : 'pay' ;
NUMBER : ([0-9]+(','[0-9]+)*)('.'[0-9]*)? ;
ID : [a-zA-Z0-9_]+ ;
NL : '\n' | '\r\n' ;
WS : [\t ]+ -> channel(HIDDEN) ; // keep the spaces (witout spaces ==> paydeltaco98)
File ExpenseMyListener.java :
public class ExpenseMyListener extends ExpenseBaseListener {
ExpenseParser parser;
public ExpenseMyListener(ExpenseParser parser) { this.parser = parser; }
public void exitPayments(ExpenseParser.PaymentsContext ctx) {
System.out.println(">>> in ExpenseMyListener for paymentsss");
System.out.println(">>> there are " + ctx.payment().size() + " elements in the list of payments");
for (int i = 0; i < ctx.payment().size(); i++) {
System.out.println(ctx.payment(i).getText());
}
}
public void exitPayment(ExpenseParser.PaymentContext ctx) {
System.out.println(">>> in ExpenseMyListener for payment");
System.out.println(parser.getTokenStream().getText(ctx));
}
}
File test_expense.java :
import org.antlr.v4.runtime.ANTLRFileStream;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.*;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;
public class test_expense {
public static void main(String[] args) throws IOException {
ANTLRInputStream input = new ANTLRFileStream(args[0]);
ExpenseLexer lexer = new ExpenseLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
ExpenseParser parser = new ExpenseParser(tokens);
ParseTree tree = parser.payments();
System.out.println("---parsing ended");
ParseTreeWalker walker = new ParseTreeWalker();
ExpenseMyListener my_listener = new ExpenseMyListener(parser);
System.out.println(">>>> about to walk");
walker.walk(my_listener, tree);
}
}
Input file top.text :
pay Acme Corp 123,456
pay Banana Inc 456789.00
pay charlie pte 123,456.89
pay delta co 98
Execution :
$ export CLASSPATH=".:/usr/local/lib/antlr-4.6-complete.jar"
$ alias
alias a4='java -jar /usr/local/lib/antlr-4.6-complete.jar'
alias grun='java org.antlr.v4.gui.TestRig'
$ a4 Expense.g4
$ javac Ex*.java
$ javac test_expense.java
$ grun Expense payments -tokens -diagnostics top.text
[@0,0:2='pay',<'pay'>,1:0]
[@1,3:3=' ',,channel=1,1:3]
[@2,4:7='Acme',,1:4]
[@3,8:8=' ',,channel=1,1:8]
[@4,9:12='Corp',,1:9]
...
[@32,90:89='',,5:0]
Expense last update 1853
Payement found 123,456 to Acme Corp
Payement found 456789.00 to Banana Inc
Payement found 123,456.89 to charlie pte
Payement found 98 to delta co
$ java test_expense top.text
Expense last update 1853
Payement found 123,456 to Acme Corp
Payement found 456789.00 to Banana Inc
Payement found 123,456.89 to charlie pte
Payement found 98 to delta co
---parsing ended
>>>> about to walk
>>> in ExpenseMyListener for payment
pay Acme Corp 123,456
>>> in ExpenseMyListener for payment
pay Banana Inc 456789.00
>>> in ExpenseMyListener for payment
pay charlie pte 123,456.89
>>> in ExpenseMyListener for payment
pay delta co 98
>>> in ExpenseMyListener for paymentsss
>>> there are 4 elements in the list of payments
payAcmeCorp123,456
payBananaInc456789.00
paycharliepte123,456.89
paydeltaco98