2014-10-16 72 views
0

我基本上有下面的說法,並且希望它能夠處理同樣的東西,不管它以什麼順序出現。例如,因爲當前的代碼,它會接受「ABS(5)+ 3」,但不接受「3 + ABS(5)」。有誰知道我可以如何讓它以任何順序工作?JavaCC - 如何在本聲明中下訂單無關緊要?

我認爲把所有東西都放到OR中,然後用*代替它會起作用,但這似乎沒有太大區別。

((s1=ABS() { s=s+s1; }) 
| ("+" { op="+"; s=s+op; } 
    | "-" { op="-"; s=s+op; } 
    | "*" { op="*"; s=s+op; } 
    | "/" { op="/"; s=s+op; }) 
| (s1=EXPR() { s=s+s1; }))* 

回答

0

我認爲你幾乎走在正確的軌道上。你想,一個ABS可以是一種EXPR,那麼您對複合表達式規則可以

s = EXPR() 
(
    (
     "+" { op="+"; s=s+op; } 
    | "-" { op="-"; s=s+op; } 
    | "*" { op="*"; s=s+op; } 
    | "/" { op="/"; s=s+op; } 
    ) 
    s1=EXPR() { s=s+s1; } 
)* 

EXPR的身體看起來像

(s = ABS() | s = NUMBER()) 
{return s;} 

由於EJP在他們的回答中指出,這並不涉及運營商的優先級,但是目前還不清楚這是一個直接的目標。另外,您稱之爲Expr的通常稱爲Primary。有關優先級和關聯性的更多信息,請參閱 Parsing Expressions by Recursive Descent

0

基本上,你完全錯了。表達式語法應該和其他語言一樣,expression, term, factor,primary.函數調用如ABS()應該出現在primary的生產中,除此之外,還有其他地方,以及文字,'(' expression ')'等等。