gpt4 book ai didi

syntax - Algol : correct syntax leads to problems in compilation?

转载 作者:行者123 更新时间:2023-12-02 10:44:03 30 4
gpt4 key购买 nike

这是一个相对简单的代码,用于“在半径为2个单位的圆象限上使用中坐标规则评估pi”。
main.alg

BEGIN
REAL x, y, sumy, pi;
INT n := lowerlimit, p := 1, lowerlimit := 10, upperlimit := 100, interval := 10;

FOR n BY interval TO upperlimit DO
sumy := 0.0;

FOR p BY 2 TO n+n-1 DO
x := p/n;
y := sqrt(4.0 - x**2);
sumy := sumy + y;
OD
pi := sumy * (2.0 / n);
print((n,pi))
OD
END

我收到以下错误:
a68g: syntax error: 1: possibly a missing or erroneous separator nearby.                                                                             
sh-4.3$ a68g main.alg
13 sumy := sumy + y;
1
a68g: warning: 1: skipped superfluous semi-symbol.
15 pi := sumy * (2.0 / n);
1
a68g: syntax error: 1: possibly a missing or erroneous separator nearby.

试试 live here

我究竟做错了什么?如何纠正?

最佳答案

简短答案:
以下代码已修复您的特定问题...

要记住的是,“;”是一个“语句分隔符” ...所以所有“复合语句”都应将每个语句都用“;”分隔。例如,考虑:

statement; statement; statement # is a valid program #
statement; statement statement; # is not valid #

(statement; statement; statement) # is a valid program #
(statement; statement; statement;) # is not valid #
(statement; statement; statement); # is not valid #

道德是...用“;”分隔所有语句。并且不要放一个“;”最后一条语句之后。 (例如,在END,FI,DO,“)”或ESAC之前)
BEGIN
REAL x, y, sumy, pi;
INT n := lowerlimit, p := 1, lowerlimit := 10, upperlimit := 100, interval := 10;

FOR n BY interval TO upperlimit DO
sumy := 0.0;

FOR p BY 2 TO n+n-1 DO
x := p/n;
y := sqrt(4.0 - x**2);
sumy := sumy + y
OD;
pi := sumy * (2.0 / n);
print((n,pi))
OD
END

有趣的是,您通常可以使用“,”代替“;”,这告诉编译器您不在乎语句的运行顺序。它被称为GOMMA。 (收缩 继续逗号)

例如应当谨慎使用GOMMA,因为不需要编译器来警告您有关副作用的信息……例如(理论上)
#!/usr/bin/a68g --script #
# -*- coding: utf-8 -*- #

INT x:=0;
(x+:=1, x+:=2); # allow the compiler the choice of threading #
PAR(x+:=10, x+:=20); # force statements into different threads #
printf(($"Answer="gl$,x))

答案是什么? ...可能是33,但也可能是21或12,依您的编译器而定。

在这种情况下,+:=操作是如此之小而又迅速,以至于答案可能是33。

长答案:
语句分隔符在语言中的位置多年来引起了悲伤。例如,请考虑以下缺少逗号的FORTRAN代码:
DO 999 I=1 1000
PRINT *,I
999 CONTINUE

在启动 Project Mercury之前已发现并纠正了该错误。都市神话认为 Mariner Program有类似的错误会导致崩溃。

请注意,使用“Fake”语句通常很有用,该语句用于满足语法/语义要求。 Python作为各种示例,例如:“None”,“NoneType”和“pass”。 Algol68具有“VOID”,“SKIP”和“〜”

演示SKIP(或“〜”)的用法。
BEGIN
REAL x, y, sumy, pi;
INT n := lowerlimit, p := 1, lowerlimit := 10, upperlimit := 100, interval := 10;

FOR n BY interval TO upperlimit DO
sumy := 0.0;

FOR p BY 2 TO n+n-1 DO
x := p/n;
y := sqrt(4.0 - x**2);
sumy := sumy + y; SKIP # insert a "fake statement after the ";" #
OD; # the ";" is still needed #
pi := sumy * (2.0 / n);
print((n,pi))
OD
END

SKIP通常用于允许对代码进行清晰注释:
statement1;
statement2;
SKIP COMMENT
statement3;
statement4 # eg. no ";" on the last statement #
END COMMENT

如果没有,则无法跳过该程序。

对于Algol68,存在一个奇怪的情况 Yoneda的歧义。此后,这种模糊性困扰了众多编程语言,包括Ada和python,甚至C ...

要了解更多信息,请去大学图书馆阅读: "A History of ALGOL 68"-CH Lindsey撰写-[坦率地反射(reflect)了语言设计过程的“邮件修订”,语言功能在“The Bend”中挣扎,并且包含/排除了歧义(例如Yoneda的歧义和乱伦的工会)]

在python中,他们尝试通过使“分隔符”成为 optional 并通过缩进将其隐藏来避开……但逗号歧义仍然存在。发现以下语法/语义错误和运行时错误...
print [i for i in ()]
print [i for i in (1)]
print [i for i in (1,2)]
print [i for i in (1,2,3)]
ab="ab etc etc etc"
print "first 2 only: %c,%c"%ab[0:2]

C还因“我在哪里放置分号和逗号”而遭受了一些折磨...逻辑是“;”事实证明, 有时是,而您 确实不需要“;};”,所以永远不要跟随“}”,例如永远是“;}”,但永远不要“};”。

然后,C会在作品中完全抛出一个 Spanner ,以逗号表示,永远不会“,)”,但有时却是“),”。

1968年的Algol68确实针对此类歧义产生了错误消息。这个故事的寓意可能是:如果您的编译器在编译时没有发现这种歧义,那么(也许)您应该选择另一种语言。

顺便说一句:您可以找到一些示例Algol68程序here ...接下来是去除尖锐边缘的代码。
INT lower limit = 10, upper limit = 100, interval = 10;

PROC circle = (REAL x)REAL: sqrt(4 - x**2);

FOR n FROM lower limit BY interval TO upper limit DO
REAL sum y := 0;

FOR p FROM 1 BY 2 TO 2*n DO
REAL x = p/n;
REAL y = circle(x);
sum y +:= y
OD;
REAL pi := sum y * 2 / n;
printf(($g(0)": "g(-real width,real width-2)l$,n,pi))
OD

比较代码更改以查看是否可以弄清效果以及它们提供的提示... :-)

或... ,这是如何编码标准数字正交程序以进行共享的方法。请注意,将传递函数用作参数,尤其是这里有一个称为Currying的概念circle(2,) ...,其中逗号很重要!
INT lower limit = 10, upper limit = 100, interval = 10;

PROC circle = (REAL radius, x)REAL: sqrt(radius**2 - x**2);

PROC mid point integrate = (PROC(REAL)REAL f, REAL lwb, upb, INT num steps)REAL: (
REAL dx := (upb - lwb ) / num steps;
REAL x := lwb + dx/2;
REAL sum y := 0;

FOR p TO num steps DO
REAL y = f(x);
sum y +:= y;
x +:= dx
OD;
sum y * dx
);

FOR num steps FROM lower limit BY interval TO upper limit DO
REAL pi := mid point integrate(circle(2,),0,2,num steps);
printf(($g(0)": "g(-real width,real width-2)l$,num steps,pi))
OD

关于syntax - Algol : correct syntax leads to problems in compilation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42764576/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com