簡體   English   中英

Antlr4 RPN Calc; 缺少最終結果

[英]Antlr4 RPN Calc; final result on stack missing

免責聲明:這是課程工作,這也是我的第一篇SO帖子,因為通常我以前總是問過我的問題

在簡短講解antlr的速成課程之后,我已盡力弄清楚如何最好地解決創建支持數值,邏輯和關系運算的RPN計算器的問題。 僅接受int和boolean。

現在,雖然我的代碼可能還遠遠不能達到標准的antlr質量,但是除了我的“開始”規則匹配時,所有代碼都可以正常工作。 我希望它從堆棧中打印出結果,但是由於某種原因,匹配后堆棧始終為空。

例如2 3 +; 通過我的打印調試語句,我看到一切都被推送,彈出,並且5的結果被按預期推送。 但是一旦終止“;”,堆棧便為空。 與“開始”規則匹配。

我確定這里缺少基本的東西,因為我們在課堂上只花了一天的時間,但我無法弄清楚。 我沒有運氣為antlr4找到調試器,這使我可以在運行時逐步調試代碼,但是在進行過程中確實打印出了輸入,彈出的項目和推送的項目,一切似乎直到“開始”為止

以下是我的代碼示例,僅包含加法運算,沒有布爾輸入:

grammar RPN;    

@header {
    import java.util.Stack;
}

@members {
    Stack<String> s = new Stack<String>();
    int first;
    int second;

    int parseInteger(String value) {
        if(tryParseInt(value)) {
            System.out.println("Integer parsed from stack: " + value + "\n");
            return Integer.parseInt(value);
        } else {
            System.out.println("ERROR: Invalid integer value; Unable to parse\n");
            return 0;
        }
    }
    boolean tryParseInt(String value) {
        try {
            Integer.parseInt(value);
            return true;
        } catch(NumberFormatException nfe) {
            return false;
        }
}
    boolean stackCheck(Stack st, int size) {
        if(st.size() >= size) {
            return true;
        }
        else {
            System.out.println("ERROR: Operation needs " + Integer.toString(size) + " values\n");
            return false;
        }
    }
}

// PARSER RULES
start
    : ( expr+ ';')+ EOF
                {
                    if(stackCheck(s, 1)) {
                        System.out.println("Result: " + s.pop() + ';');
                    }
                    if(s.size() > 0) {
                        System.out.println("Too many operands supplied\n");
                    }
                };
expr
    : atom+ OPERATION;

atom
    : INT;

// LEXER RULES
INT         
    : [0-9]+    { s.push(getText()); };
OPERATION   
    : '+'       {
                    if(stackCheck(s, 2)) {
                        second = parseInteger(s.pop());
                        first = parseInteger(s.pop());
                        s.push(Integer.toString(first + second));
                    }
                };
WS          
    : ( ' ' | '\t' | '\r' | '\n' )+   {skip();};

我已經解決了我的問題。 我仍然不完全了解為什么,但是似乎解析器規則先於詞法分析器規則運行。 因此,我更改了程序,以使我的解析器規則具有推動新輸入和執行操作的操作。

如果有人可以幫助我理解這是為什么,我將不勝感激。 在我看來,解析器規則由其他解析器規則和詞法分析器規則組成。 Lexer規則由正則表達式規則組成。 由於該詞法分析器是最低的公分母,因此我假設將首先調用詞法分析器規則,但是在與antlr玩耍時發現這是錯誤的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM