2014-01-26 65 views
1

閱讀this帕斯卡BNF語法我不明白爲什麼需要出現在函數定義中的end之後。功能鐓看到後,function-block多數民衆贊成block可能會出現:在這個BNF語法中匹配的地方; '結束'後

function-declaration = 
    function-heading ";" function-body | 
    function-heading ";" directive | 
    function-identification ";" function-body . 
function-body = 
    block . 

begin出現,這是一個statement-par的一部分,這是一個塊的一部分,它是由statement-part處理,對不對?

block = 
    declaration-part statement-part . 
statement-part = 
    begin statement-sequence end . 

注意statement-partend關鍵字後不存在;,這不是statement-sequence的一部分。所以,我不明白編譯器有缺乏;如何索賠後end關鍵字,就像這個例子:

function myabs(i : integer) : integer; 
begin 
    if i < 0 then begin i := -i; end; < -- it's process by statement-sequence, so, ';' may appear 
    myabs := i; 
end; <-- it is the semicolon what about I'm speaking 

我缺少什麼?我讀錯了語法嗎?我試過的所有Pascal編譯器都會給出一個錯誤,如果我省略這個。

+0

就在這個相同的鏈接,它是彙集了'功能declaration'和'功能body',即部分:'程序 - 和 - function-declaration-part = {(procedure-declaration | function-declaration)「;」 }這就是分號的地方。 – lurker

+0

爲什麼-1? donwvoter請解釋一下? –

回答

1

結束後您不必有分號。就那麼簡單。

分號用於分隔語句。所以,如果不是最後一條語句,你只需要在分號結尾後加分號。如果這是最後一個陳述,你應該完全停下來。

現在,在BNF中也可能存在一些錯誤,這意味着根據BNF,您不必在實際需要的地方使用分號,但要弄清楚的唯一方法是分析整個BFN詳細,我不覺得是建設性的。 :-)

但是在這種情況下,我認爲你錯過的是一個procedure or function declaration must end with a semi-colon

+0

但是爲什麼任何Pascal編譯器(我嘗試過的)都會說「預計」,「但是其他的東西」等等。 –

+0

@TheMask因爲它預期在該位置有一個分號,但它沒有找到。請不要誤解,在您詢問的位置應該有一個分號。 –

+0

我以前沒見過你編輯過。非常感謝。 :)真的,我之前讀過所有這個程序員,並沒有注意到這一點。 –

1

程序和功能並不需要用分號來終止,但必須通過一個分開:

the Pascal BNF

proc-and-func-declaration: 
    proc-or-func 
    proc-and-func-declaration ; proc-or-func 
2

ANTLRWorks是你最好的朋友在這裏。

如果你嘗試一些帕斯卡語法如http://www.monperrus.net/martin/pascal-antlr3使用antlrworks(http://www.antlr3.org/works/),你會看到一個像程序

program first; 
function myabs(i : integer) : integer; 
begin 
end; 
begin 
end. 

會這樣

enter image description here

這樣你就可以被解析確切地看到發生了什麼。

ps。我提供給你的pascal語法鏈接有一個特定的令牌有問題,但我敢打賭你可以解決這個問題;-)

ps2。更新 - antlrworks截圖,以幫助@Jack

enter image description here

+0

你是如何從整個語法創建這個圖的?我只能從所選語法(鼠標所在的位置)創建。 – Jack

+0

@Jack,這樣做:打開antlrworks 1.5.2,打開語法(ctrl + O),將pascal片段粘貼到左側文本區域(選項卡「解釋器」)。在左側文本區域上方的選擇框中默認選擇「program」,然後點擊「play」圖標。我在答案中添加了屏幕截圖。 – Leo