我正在嘗試做一個沒有論壇幫助的舊存檔 java 課程。我已經被一個問題困住了幾天,非常感謝任何形式的幫助。我應該使用決議器制作一個抽象的語法樹。決議器從運算式語法檔案中讀取,然后我必須使用遞回呼叫創建一個抽象樹。我寫的運算式語法是
@skip whitespace{
root ::= expr;
expr ::= (product | sum) ((add| multi)* (product | sum)*)* ;
sum ::= primitive ( add primitive)* ;
product ::= primitive (multi primitive)*;
primitive ::= variable | number | '(' sum ')' | '(' product ')' ;
}
whitespace ::= [ \t\r\n];
number ::= [0-9] ('.'[0-9] )*;
variable ::= [a-zA-Z] ;
add ::= ' ';
multi ::= '*';
使用此語法,我為輸入生成的樹1 2 3*4 5 6*7 8 (3*2*1)
附在下面

您可以看到它在括號中時選擇了乘積,但我似乎不知道如何撰寫這樣的語法,3*4并且6*7也被捕獲為 aproduct并且Sums乘法符號之前的數字不包含在前一個 sum 節點中
uj5u.com熱心網友回復:
你可以擺脫expr這里,但它可能像這樣更具可擴展性。無論如何,它真的比你想象的要簡單得多:
root ::= expr;
expr ::= sum;
sum ::= product ( add product )* ;
product ::= primitive ( multi primitive )* ;
primitive ::= variable | number | '(' expr ')' ;
這應該是直觀的(如果你磨練你的直覺:-) 總和是幾個產品的總和;乘積不能是總和的乘積。它可以是帶括號的和的乘積,但帶括號的和不是和;從語法上講,這是一個原始的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/484530.html
