阅读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-par
是statement-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编译器都会出错。
答案 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.
将像这样解析
所以你可以确切地看到发生了什么。
PS。我提供给你的pascal语法链接有一个特定令牌的问题,但我打赌你可以解决这个问题; - )
PS2。更新 - antlrworks截图以帮助@Jack
答案 1 :(得分:1)
结束后您不必使用分号。就这么简单。
分号用于分隔语句。所以如果它不是最后一个语句,你只需要在结束后有一个分号。如果这是最后一个陈述,你应该完全停止。
现在,BNF中也可能存在一些错误,这意味着根据BNF,您不必在实际需要的地方使用分号,但解决问题的唯一方法是分析整个BFN的细节,我觉得不具有建设性。 : - )
但在这种情况下,我认为你错过的是procedure or function declaration must end with a semi-colon。
答案 2 :(得分:1)
程序和函数不需要用分号终止,但它们必须用一个分隔:
proc-and-func-declaration:
proc-or-func
proc-and-func-declaration ; proc-or-func