can an element contain attribute as parsed by parser generated by ANTLR? if so, how?

前端 未结 3 1865
野性不改
野性不改 2021-01-26 17:42

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

3条回答
  •  感动是毒
    2021-01-26 18:21

    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
    

提交回复
热议问题