这个BNF语法匹配的地方;在'结束'之后

时间:2014-01-26 02:29:37

标签: pascal bnf

阅读this Pascal BNF语法我无法理解为什么;需要在函数定义中出现end。看到函数标题后,可能会显示function-block block

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

begin出现时,statement-parstatement-part的一部分,它是一个块的一部分,它由 block = declaration-part statement-part . statement-part = begin statement-sequence end . 处理,对吧?

statement-part

注意;end关键字后面没有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 ,如下例所示:

{{1}}

我错过了什么?我读错了语法吗?如果省略这个,我试过的所有Pascal编译器都会出错。

3 个答案:

答案 0 :(得分:2)

ANTLRWorks是您最好的朋友。

如果您使用antlrworks(http://www.monperrus.net/martin/pascal-antlr3)尝试某些pascal语法,例如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

答案 1 :(得分:1)

结束后您不必使用分号。就这么简单。

分号用于分隔语句。所以如果它不是最后一个语句,你只需要在结束后有一个分号。如果这是最后一个陈述,你应该完全停止。

现在,BNF中也可能存在一些错误,这意味着根据BNF,您不必在实际需要的地方使用分号,但解决问题的唯一方法是分析整个BFN的细节,我觉得不具有建设性。 : - )

但在这种情况下,我认为你错过的是procedure or function declaration must end with a semi-colon

答案 2 :(得分:1)

程序和函数不需要用分号终止,但它们必须用一个分隔:

来自the Pascal BNF

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