簡體   English   中英

前綴表示法的算術表達式語法(Java Cup)

[英]Arithmetic expression grammar in prefix notation (Java Cup)

我正在用前綴表示法為算術表達式編寫語法。 但是在解析負數或減數時我遇到了一個問題。 語法示例是這樣的:

precedence right +, -;
precedence right *, /;
precedence right uminus;

E ::= + E E
   |  - E E
   |  * E E
   |  / E E
   |  ( E )
   |  - E %prec uminus
   |  id
   |  digit
   ;

但是,如果我的輸入是- 5 4 ,它將5減少為E ,接下來將其減少- E (負數),然后解析器給出4的語法錯誤。 正確的一個應該是5作為E ,其次是4作為E ,然后- EE作為E 如何使用關聯性解決此問題? 還是我需要重寫語法?

(從評論中提升)

您的語法確實是模棱兩可的,並且優先聲明對您毫無幫助。

考慮輸入包括以下各項的輸入N -令牌,隨后M 1令牌。

- - - - - - - ... - 1 1 1 ... 1

為了使其成為表達式, -令牌的M-1必須是二進制的,其余N-(M-1)一元的,但是無法分辨出哪一個(除非它們都是二進制的)。

即使你武斷地說,第一N-(M-1) - s為一元,你看不出來的價值是什么N-(M-1)直到你讀完整個輸入,這意味着你可以不用有限的前瞻進行解析。

但是,前綴表示法的全部要點是避免使用括號。 像上面這樣的任意聲明使它無法表示替代解釋,因此某些表達式將無法用前綴表示法表示。 那是完全錯誤的。

這是一個簡單的案例:

- 5 - - - 4 3 1

或者是

5 - (- (4 - (3 - 1)))
5 - ((- (4 - 3)) - 1)
5 - (((- 4) - 3) - 1)

在前綴表示法中,您需要聲明每個運算符的“ arity”,或者隱式地聲明(每個運算符都有已知數量的參數),或者顯式地使用從Prolog借來的這種表示法:

-/2 5 -/2 -/2 -/1 4 3 1

另外,您可以使用強制括號來分隔參數,例如Lisp / Scheme“ s-exprs”:

(- 5 (- (- (- 4) 3) 1))

首先,刪除所有優先級聲明。 前綴語法中不需要它們。 實際上,這足以解決任何解析器生成器中的問題。 BTW,您使用的是哪一個?

杯子前瞻性有限。 正如@rici所指出的,在這種情況下無法解決歧義。 你可以做的是限制文法所以只是一個連續的一元-可以使用。

    B ::= E
       |  - E
       ;
    E ::= + B B
       |  - B B
       |  * B B
       |  / B B
       |  ( B )
       |  id
       |  digit
       ;

由於我很生疏,請多次檢查以上內容。

暫無
暫無

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

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