簡體   English   中英

對於一元運算符,運算符優先級或最大蒙克規則首先出現

[英]Operator precedence or Maximal Munch Rule comes first for Unary Operators

在這里,我有以下代碼:

int a,b,x;
a=b=1;
x=a+++b;

現在x的值將為2,因為a首先是后遞增 ,然后將其添加到b

以下是編譯的字節代碼:

 0  iconst_1
 1  dup
 2  istore_2 [b]
 3  istore_1 [a]
 4  iload_1 [a]
 5  iinc 1 1 [a]
 8  iload_2 [b]
 9  iadd
10  istore_3 [x]

因此表達式將等效於x = (a++) + b

現在另一個表達式x=a++++b ,由於最大的munch規則而無法編譯。 它將成為x = (a++) ++ b ,因此編譯錯誤。

上述x=a+++b行為是因為運算符 ++的優先級還是因為最大的munch規則

引用詞匯翻譯

每個步驟都使用盡可能長的翻譯,即使結果最終沒有制作正確的程序,而另一個詞匯翻譯也是如此。

因此,輸入字符a-b被標記化( §3.5 )為a-b ,它不是任何語法正確程序的一部分,即使標記化a--b可能是語法的一部分正確的程序。

這可以解釋原因

x=a+++b

被解析為

x=(a++)+b

另一方面, a++++b被標記為++++b ,這會導致錯誤。

僅當“++”左側有變量時,才會識別一元運算符“++”。 當你寫一個+++ b時,第三個加號是二進制運算符“add”,而第一個運算符(++)是“遞增變量1”。 當你寫“a ++++”時,事情會失敗,因為這就像寫a<unary increment variable by 1> <add> <add>並且第一個運算符缺少一個參數。 第二對加號不被識別為“增量變量”,因為(a ++)不是變量。

現在有趣的是,Java編譯器當前需要空格才能正確識別

z = a++ + ++b;  // this works
z = a+++++b;    // this fails

作為一個舊的編譯器編寫器,我希望這兩個結構應該在語法上被評估為相同(識別兩個一元運算符++和++

最大munch是在詞法分析器中使用的規則,解析器中的運算符優先級,並且詞法分析器在解析器之前在概念上運行。 因此, x=a+++b變成x=(a++)+b因為最大的munch規則,而不是運算符優先級:

當詞法分析器看到a+++b會將其轉換為標記[標識符a ] [雙加] [加號] [標識符b ]。 [double plus]令牌是由於最大咬合(采用最長匹配,而++長於+ )。 然后,無論運算符優先級如何,解析器都只能將其轉換為(a ++)+ b。

暫無
暫無

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

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